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

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

Unicode (#50) 前準備
Byte→Char (#51) 型名は殆ど完了、ただし中身までは手を付けていないものが多い

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