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
Line 
1Class String
2 m_Length As Long
3Public
4 Chars As *Char
5
6 Sub String()
7 Chars = _System_calloc(SizeOf (Char) * 1)
8 m_Length = 0
9 End Sub
10
11 Sub String(initStr As *Char)
12 String()
13 Assign(initStr)
14 End Sub
15
16 Sub String(ByRef initStr As String)
17 String()
18 Assign(initStr)
19 End Sub
20
21 Sub String(length As Long)
22 String()
23 ReSize(length)
24 End Sub
25
26 Sub String(initChar As Char, length As Long)
27 ReSize(length, initChar)
28 End Sub
29
30 Sub ~String()
31 _System_free(Chars)
32 Chars = 0
33#ifdef _DEBUG
34 m_Length = 0
35#endif
36 End Sub
37
38 Const Function Length() As Long
39 Return m_Length
40 End Function
41
42 Function Operator() As *Char
43 Return Chars
44 End Function
45
46 Sub Operator = (ByRef objString As String)
47 Assign(objString.Chars, objString.m_Length)
48 End Sub
49
50 Sub Operator = (text As *Char)
51 Assign(text)
52 End Sub
53
54 Const Function Operator[] (n As Long) As Char
55 Return Chars[n]
56 End Function
57
58 Sub Operator[]= (n As Long, c As Char)
59 Chars[n] = c
60 End Sub
61
62 Const Function Operator + (lpszText As *Char) As String
63 Return Concat(lpszText, lstrlen(lpszText))
64 End Function
65
66 Const Function Operator + (ByRef objString As String) As String
67 Return Concat(objString, objString.m_Length)
68 End Function
69
70 Const Function Operator & (lpszText As *Char) As String
71 Dim tempString = This + lpszText
72 Return tempString
73 End Function
74
75 Const Function Operator & (ByRef objString As String) As String
76 Dim tempString = This + objString
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
88 Function Operator== (lpszText As *Char) As Long
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
100 Function Operator<> (lpszText As *Char) As Long
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
112 Function Operator< (lpszText As *Char) As Long
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
128 Function Operator> (lpszText As *Char) As Long
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
144 Function Operator<= (lpszText As *Char) As Long
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
160 Function Operator>= (lpszText As *Char) As Long
161 If lstrcmp(This, lpszText) => 0 Then
162 Return _System_TRUE
163 Else
164 Return _System_FALSE
165 End If
166 End Function
167
168 Function StrPtr() As *Char
169 Return Chars
170 End Function
171
172 Sub ReSize(allocLength As Long)
173 If allocLength < 0 Then Exit Sub
174 If allocLength > m_Length Then
175 Dim oldLength As Long
176 oldLength = m_Length
177 If AllocStringBuffer(allocLength) <> 0 Then
178 ZeroMemory(VarPtr(Chars[oldLength]), SizeOf (Char) * (m_Length - oldLength + 1))
179 End If
180 Else
181 m_Length = allocLength
182 Chars[m_Length] = 0
183 End If
184 End Sub
185
186 Sub ReSize(allocLength As Long, c As Char)
187 If allocLength < 0 Then
188 Exit Sub
189 ElseIf allocLength > m_Length Then
190 Dim oldLength As Long
191 oldLength = m_Length
192 If AllocStringBuffer(allocLength) <> 0 Then
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
199 End If
200 Else
201 m_Length = allocLength
202 End If
203 Chars[m_Length] = 0
204 End Sub
205
206 Sub Assign(text As *Char, textLength As Long)
207 If text = Chars Then Exit Sub
208 If AllocStringBuffer(textLength) <> 0 Then
209 memcpy(Chars, text, SizeOf (Char) * textLength)
210 Chars[m_Length] = 0
211 End If
212 End Sub
213
214 Sub Assign(ByRef objString As String)
215 Assign(objString.Chars, objString.m_Length)
216 End Sub
217
218 Sub Assign(text As *Char)
219 If text Then
220 Assign(text, lstrlen(text))
221 Else
222 'Chars=_System_realloc(Chars,1)
223 Chars[0] = 0
224 m_Length = 0
225 End If
226 End Sub
227
228 Sub Append(text As *Char, textLength As Long)
229 Dim prevLen As Long
230 prevLen = m_Length
231 If AllocStringBuffer(m_Length + textLength) <> 0 Then
232 memcpy(VarPtr(Chars[prevLen]), text, SizeOf (Char) * textLength)
233 Chars[m_Length] = 0
234 End If
235 End Sub
236
237 Sub Append(text As *Char)
238 Append(text, lstrlen(text))
239 End Sub
240
241 Sub Append(ByRef str As String)
242 Append(str.Chars, str.m_Length)
243 End Sub
244
245 Function Concat(lpszText As *Char, textLength As Long) As String
246 Dim tempString As String
247 With tempString
248 .AllocStringBuffer(This.m_Length + textLength)
249 memcpy(.Chars, This.Chars, SizeOf (Char) * This.m_Length)
250 memcpy(VarPtr(.Chars[This.m_Length]), lpszText, SizeOf (Char) * textLength)
251 .Chars[.m_Length] = 0
252 End With
253 Return tempString
254 End Function
255
256 Function Contains(ByRef objString As String) As BOOL
257 If IndexOf(objString, 0, m_Length) >= 0 Then
258 Return _System_TRUE
259 Else
260 Return _System_FALSE
261 End If
262 End Function
263
264 Function Contains(lpszText As *Char) As BOOL
265 If IndexOf(lpszText, 0, m_Length) >= 0 Then
266 Return _System_TRUE
267 Else
268 Return _System_FALSE
269 End If
270 End Function
271
272 Function IndexOf(lpszText As *Char) As Long
273 Return IndexOf(lpszText, 0, m_Length)
274 End Function
275
276 Function IndexOf(lpszText As *Char, startIndex As Long) As Long
277 Return IndexOf(lpszText, startIndex, m_Length - startIndex)
278 End Function
279
280 Function IndexOf(lpszText As *Char, startIndex As Long, count As Long) As Long
281 Dim length As Long
282 length = lstrlen(lpszText)
283
284 If startIndex < 0 Then Return -1
285 If count < 1 Or count + startIndex > m_Length Then Return -1
286 If length > m_Length Then Return -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
293 If Chars[i + j] = lpszText[j] Then
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
303 Function LastIndexOf(lpszText As *Char) As Long
304 Return LastIndexOf(lpszText, m_Length - 1, m_Length)
305 End Function
306
307 Function LastIndexOf(lpszText As *Char, startIndex As Long) As Long
308 Return LastIndexOf(lpszText As *Char, startIndex, startIndex + 1)
309 End Function
310
311 Function LastIndexOf(lpszText As *Char, startIndex As Long, count As Long) As Long
312 Dim length As Long
313 length = lstrlen(lpszText)
314
315 If startIndex < 0 Or startIndex > m_Length - 1 Then Return -1
316 If count < 1 Or count > startIndex + 2 Then Return -1
317 If length > m_Length Then Return -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
324 If Chars[i + j] = lpszText[j] Then
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
334 Function StartsWith(lpszText As *Char) As BOOL
335 If IndexOf(lpszText) = 0 Then
336 Return _System_TRUE
337 Else
338 Return _System_FALSE
339 End If
340 End Function
341
342 Function EndsWith(lpszText As *Char) As BOOL
343 If LastIndexOf(lpszText) = m_Length - lstrlen(lpszText) Then
344 Return _System_TRUE
345 Else
346 Return _System_FALSE
347 End If
348 End Function
349
350 Function Insert(startIndex As Long, text As *Char) As Long
351 Dim length As Long
352 length = lstrlen(text)
353
354 If startIndex < 0 Or startIndex > m_Length Then Return -1
355
356 Dim newChars As *Char
357 newChars = _System_malloc(SizeOf (Char) * (length + m_Length + 1))
358 If newChars = 0 Then Return -1
359
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))
363
364 _System_free(Chars)
365 Chars = newChars
366 m_Length = length + m_Length
367 Return m_Length
368 End Function
369
370 Function SubString(startIndex As Long) As String
371 Return SubString(startIndex, m_Length - startIndex)
372 End Function
373
374 Function SubString(startIndex As Long, length As Long) As String
375 If startIndex < 0 Or length <= 0 Then Return ""
376 If startIndex + length > m_Length Then Return ""
377
378 Dim temp As String
379 temp.AllocStringBuffer(length)
380 memcpy(temp.Chars, VarPtr(Chars[startIndex]), SizeOf (Char) * length)
381 Chars[m_Length] = 0
382 Return temp
383 End Function
384
385 Function Remove(startIndex As Long) As Long
386 If startIndex < 0 Or startIndex > m_Length Then Return -1
387 Chars[startIndex] = 0
388 m_Length = startIndex
389 Return m_Length
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
394 If startIndex + count > m_Length Then Return -1
395
396 Dim newChars As *Char
397 newChars = _System_malloc(SizeOf (Char) * (m_Length - count + 1))
398 If newChars = 0 Then Return -1
399
400 memcpy(newChars, Chars, SizeOf (Char) * startIndex)
401 memcpy(VarPtr(newChars[startIndex]), VarPtr(Chars[startIndex + count]), SizeOf (Char) * (m_Length - startIndex - count))
402 newChars[m_Length - count] = 0
403
404 _System_free(Chars)
405 Chars = newChars
406 m_Length = m_Length - count
407 Return m_Length
408 End Function
409
410 Function IsNullOrEmpty() As BOOL
411 If m_Length = 0 Then
412 Return _System_TRUE
413 Else
414 Return _System_FALSE
415 End If
416 End Function
417
418
419 Sub Replace(oldChar As Char, newChar As Char)
420 Dim i As Long
421 For i = 0 To ELM(m_Length)
422 If Chars[i] = oldChar Then
423 Chars[i] = newChar
424 End If
425 Next
426 End Sub
427
428 Sub Replace(ByRef oldStr As String, ByRef newStr As String)
429 Replace(oldStr, oldStr.m_Length, newStr, newStr.m_Length)
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
446 .Append(Chars + current, pos - current)
447 .Append(newStr, newLen)
448 current = pos + oldLen
449 Loop
450 .Append(Chars + current, m_Length - current)
451 End With
452 Swap(tempString)
453 End Sub
454
455 Sub ToLower()
456 CharLower(Chars)
457 End Sub
458
459 Sub ToUpper()
460 CharUpper(Chars)
461 End Sub
462
463 Sub Swap(ByRef x As String)
464 Dim tempLen As Long
465 Dim tempChars As PSTR
466 tempLen = x.m_Length
467 tempChars = x.Chars
468 x.m_Length = This.m_Length
469 x.Chars = This.Chars
470 This.m_Length = tempLen
471 This.Chars = tempChars
472 End Sub
473
474 Override Function ToString() As String
475 Return This
476 End Function
477
478Private
479 ' メモリ確保に失敗すると元の文字列は失われない。(例外安全でいう強い保障)
480 Function AllocStringBuffer(textLength As Long) As *Char
481 If textLength < 0 Then
482 Return 0
483 ElseIf textLength > m_Length Then
484 AllocStringBuffer = _System_realloc(Chars, SizeOf(Char) * (textLength + 1))
485 If AllocStringBuffer <> 0 Then
486 m_Length = textLength
487 Chars = AllocStringBuffer
488 End If
489 Else
490 m_Length = textLength
491 AllocStringBuffer = Chars
492 End If
493 End Function
494
495End Class
496
Note: See TracBrowser for help on using the repository browser.