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

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

#51完了

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