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

Last change on this file since 135 was 135, checked in by OverTaker, 17 years ago

Removeメソッドのバグを修整。

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