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

Last change on this file since 49 was 49, checked in by dai, 17 years ago

Sub String(ByRef initStr As String)を有効化。

File size: 11.4 KB
RevLine 
[1]1Class String
[30]2 m_Length As Long
[1]3Public
[31]4 Chars As LPSTR
[1]5
6 Sub String()
[31]7 Chars = _System_calloc(1)
[30]8 m_Length = 0
[1]9 End Sub
10
11 Sub String(initStr As LPSTR)
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*/
[41]26 Sub String(initChar As Byte, 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
[1]42 Function Operator() As LPSTR
[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
50 Sub Operator = (text As LPSTR)
51 Assign(text)
52 End Sub
53
54 Function Operator[] (n As Long) As Byte
[31]55 Return Chars[n]
[1]56 End Function
57
58 Sub Operator[]= (n As Long, c As Byte)
[31]59 Chars[n] = c
[1]60 End Sub
61
62 Function Operator+ (lpszText As LPSTR) As String
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
70 Function Operator& (lpszText As LPSTR) As String
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
90 Function Operator== (lpszText As LPSTR) As Long
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
102 Function Operator<> (lpszText As LPSTR) As Long
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
114 Function Operator< (lpszText As LPSTR) As Long
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
130 Function Operator> (lpszText As LPSTR) As Long
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
146 Function Operator<= (lpszText As LPSTR) As Long
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
162 Function Operator>= (lpszText As LPSTR) As Long
163 If lstrcmp(This, lpszText) => 0 Then
164 Return _System_TRUE
165 Else
166 Return _System_FALSE
167 End If
168 End Function
169
170 Function StrPtr() As LPSTR
[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
188 Sub ReSize(allocLength As Long, c As Byte)
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
203 Sub Assign(lpszText As LPSTR, 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
215 Sub Assign(lpszText As LPSTR)
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
225 Sub Append(lpszText As LPSTR, textLength As Long)
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
234 Sub Append(text As LPSTR)
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
242 Function Concat(lpszText As LPSTR, textLength As Long) As String
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
261 Function Contains(lpszText As LPSTR) 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
269 Function IndexOf(lpszText As LPSTR) As Long
[30]270 Return IndexOf(lpszText, 0, m_Length)
[1]271 End Function
272
273 Function IndexOf(lpszText As LPSTR, startIndex As Long) As Long
[30]274 Return IndexOf(lpszText, startIndex, m_Length - startIndex)
[1]275 End Function
276
277 Function IndexOf(lpszText As LPSTR, startIndex As Long, count As Long) As Long
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
300 Function LastIndexOf(lpszText As LPSTR) As Long
[30]301 Return LastIndexOf(lpszText, m_Length - 1, m_Length)
[1]302 End Function
303
304 Function LastIndexOf(lpszText As LPSTR, startIndex As Long) As Long
305 Return LastIndexOf(lpszText As LPSTR, startIndex, startIndex + 1)
306 End Function
307
308 Function LastIndexOf(lpszText As LPSTR, startIndex As Long, count As Long) As Long
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
331 Function StartsWith(lpszText As LPSTR) As BOOL
332 If IndexOf(lpszText) = 0 Then
333 Return _System_TRUE
334 Else
335 Return _System_FALSE
336 End If
337 End Function
338
339 Function EndsWith(lpszText As LPSTR) 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
347 Function Insert(startIndex As Long, lpszText As LPSTR) As Long
348 Dim length As Long
349 length = lstrlen(lpszText)
350
[30]351 If startIndex < 0 Or startIndex > m_Length Then Return -1
[1]352
353 Dim newChars As LPSTR
[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
393 Dim newChars As LPSTR
[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
415 Sub Replace(oldChar As Byte, newChar As Byte)
416 Dim i As Long
[30]417 For i = 0 To ELM(m_Length)
[31]418 If Chars[i] = oldChar Then
419 Chars[i] = newChar
[1]420 End If
421 Next
422 End Sub
423
424 Sub Replace(ByRef oldStr As String, ByRef newStr As String)
[30]425 Replace(oldStr, oldStr.m_Length, newStr, newStr.m_Length)
[1]426 End Sub
427
428 Sub Replace(oldStr As PCSTR, newStr As PCSTR)
429 Replace(oldStr, lstrlen(oldStr), newStr, lstrlen(newStr))
430 End Sub
431
432 Sub Replace(oldStr As PCSTR, oldLen As Long, newStr As PCSTR, newLen As Long)
433 Dim tempString As String
434 With tempString
435 Dim current = 0 As Long
436 Do
437 Dim pos As Long
438 pos = IndexOf(oldStr, current)
439 If pos = -1 Then
440 Exit Do
441 End If
[31]442 .Append(Chars + current, pos - current)
[1]443 .Append(newStr, newLen)
444 current = pos + oldLen
445 Loop
[31]446 .Append(Chars + current, m_Length - current)
[1]447 End With
448 Swap(tempString)
449 End Sub
450
451 Sub ToLower()
[31]452 CharLower(Chars)
[1]453 End Sub
454
455 Sub ToUpper()
[31]456 CharUpper(Chars)
[1]457 End Sub
458
459 Sub Swap(ByRef x As String)
460 Dim tempLen As Long
461 Dim tempChars As PSTR
[30]462 tempLen = x.m_Length
[31]463 tempChars = x.Chars
[30]464 x.m_Length = This.m_Length
[31]465 x.Chars = This.Chars
[30]466 This.m_Length = tempLen
[31]467 This.Chars = tempChars
[1]468 End Sub
469
470Private
471 ' メモリ確保に失敗すると元の文字列は失われない。(例外安全でいう強い保障)
472 Function AllocStringBuffer(textLength As Long) As LPSTR
473 If textLength < 0 Then
474 Return 0
[30]475 ElseIf textLength > m_Length Then
[31]476 AllocStringBuffer = _System_realloc(Chars, textLength + 1)
[1]477 If AllocStringBuffer <> 0 Then
[30]478 m_Length = textLength
[31]479 Chars = AllocStringBuffer
[1]480 End If
481 Else
[30]482 m_Length = textLength
[31]483 AllocStringBuffer = Chars
[1]484 End If
485 End Function
486
487End Class
488
Note: See TracBrowser for help on using the repository browser.