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
Line 
1Class String
2 m_Length As Long
3Public
4 Chars As *Char
5
6 Sub String()
7 Chars = _System_calloc(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/*
22 Sub String(length As Long)
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 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 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 Function Operator+ (lpszText As *Char) As String
63 Return Concat(lpszText, lstrlen(lpszText))
64 End Function
65
66 Function Operator+ (ByRef objString As String) As String
67 Return Concat(objString, objString.m_Length)
68 End Function
69
70 Function Operator& (lpszText As *Char) 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 *Char) 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 *Char) 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 *Char) 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 *Char) 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 *Char) 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 *Char) 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 *Char
171 Return Chars
172 End Function
173
174 Sub ReSize(allocLength As Long)
175 If allocLength < 0 Then Exit Sub
176 If allocLength > m_Length Then
177 Dim oldLength As Long
178 oldLength = m_Length
179 If AllocStringBuffer(allocLength) <> 0 Then
180 ZeroMemory(Chars + oldLength, m_Length - oldLength + 1)
181 End If
182 Else
183 m_Length = allocLength
184 Chars[m_Length] = 0
185 End If
186 End Sub
187
188 Sub ReSize(allocLength As Long, c As Char)
189 If allocLength < 0 Then
190 Exit Sub
191 ElseIf allocLength > m_Length Then
192 Dim oldLength As Long
193 oldLength = m_Length
194 If AllocStringBuffer(allocLength) <> 0 Then
195 FillMemory(Chars + oldLength, m_Length - oldLength, c)
196 End If
197 Else
198 m_Length = allocLength
199 End If
200 Chars[m_Length] = 0
201 End Sub
202
203 Sub Assign(lpszText As *Char, textLength As Long)
204 If lpszText = Chars Then Exit Sub
205 If AllocStringBuffer(textLength) <> 0 Then
206 memcpy(Chars, lpszText, textLength)
207 Chars[m_Length] = 0
208 End If
209 End Sub
210
211 Sub Assign(ByRef objString As String)
212 Assign(objString.Chars, objString.m_Length)
213 End Sub
214
215 Sub Assign(lpszText As *Char)
216 If lpszText Then
217 Assign(lpszText, lstrlen(lpszText))
218 Else
219 'Chars=_System_realloc(Chars,1)
220 Chars[0] = 0
221 m_Length = 0
222 End If
223 End Sub
224
225 Sub Append(lpszText As *Char, textLength As Long)
226 Dim prevLen As Long
227 prevLen = m_Length
228 If AllocStringBuffer(m_Length + textLength) <> 0 Then
229 memcpy(Chars + prevLen, lpszText, textLength)
230 Chars[m_Length] = 0
231 End If
232 End Sub
233
234 Sub Append(text As *Char)
235 Append(text, lstrlen(text))
236 End Sub
237
238 Sub Append(ByRef str As String)
239 Append(str.Chars, str.m_Length)
240 End Sub
241
242 Function Concat(lpszText As *Char, textLength As Long) As String
243 Dim tempString As String
244 With tempString
245 .AllocStringBuffer(This.m_Length + textLength)
246 memcpy(.Chars, This.Chars, This.m_Length)
247 memcpy(.Chars + This.m_Length, lpszText, textLength)
248 .Chars[.m_Length] = 0
249 End With
250 Return tempString
251 End Function
252
253 Function Contains(ByRef objString As String) As BOOL
254 If IndexOf(objString, 0, m_Length) >= 0 Then
255 Return _System_TRUE
256 Else
257 Return _System_FALSE
258 End If
259 End Function
260
261 Function Contains(lpszText As *Char) As BOOL
262 If IndexOf(lpszText, 0, m_Length) >= 0 Then
263 Return _System_TRUE
264 Else
265 Return _System_FALSE
266 End If
267 End Function
268
269 Function IndexOf(lpszText As *Char) As Long
270 Return IndexOf(lpszText, 0, m_Length)
271 End Function
272
273 Function IndexOf(lpszText As *Char, startIndex As Long) As Long
274 Return IndexOf(lpszText, startIndex, m_Length - startIndex)
275 End Function
276
277 Function IndexOf(lpszText As *Char, 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
282 If count < 1 Or count + startIndex > m_Length Then Return -1
283 If length > m_Length Then Return -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
290 If Chars[i + j] = lpszText[j] Then
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 *Char) As Long
301 Return LastIndexOf(lpszText, m_Length - 1, m_Length)
302 End Function
303
304 Function LastIndexOf(lpszText As *Char, startIndex As Long) As Long
305 Return LastIndexOf(lpszText As *Char, startIndex, startIndex + 1)
306 End Function
307
308 Function LastIndexOf(lpszText As *Char, startIndex As Long, count As Long) As Long
309 Dim length As Long
310 length = lstrlen(lpszText)
311
312 If startIndex < 0 Or startIndex > m_Length - 1 Then Return -1
313 If count < 1 Or count > startIndex + 2 Then Return -1
314 If length > m_Length Then Return -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
321 If Chars[i + j] = lpszText[j] Then
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 *Char) 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 *Char) As BOOL
340 If LastIndexOf(lpszText) = m_Length - lstrlen(lpszText) Then
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 *Char) As Long
348 Dim length As Long
349 length = lstrlen(lpszText)
350
351 If startIndex < 0 Or startIndex > m_Length Then Return -1
352
353 Dim newChars As *Char
354 newChars = _System_malloc(length + m_Length + 1)
355 If newChars = 0 Then Return -1
356
357 memcpy(newChars, Chars, startIndex)
358 memcpy(newChars + startIndex, lpszText, length)
359 memcpy(newChars + startIndex + length, Chars + startIndex, m_Length - startIndex + 1)
360
361 _System_free(Chars)
362 Chars = newChars
363 m_Length = length + m_Length
364 Return m_Length
365 End Function
366
367 Function SubString(startIndex As Long) As String
368 Return SubString(startIndex, m_Length - startIndex)
369 End Function
370
371 Function SubString(startIndex As Long, length As Long) As String
372 If startIndex < 0 Or length <= 0 Then Return ""
373 If startIndex + length > m_Length Then Return ""
374
375 Dim temp As String
376 temp.AllocStringBuffer(length)
377 memcpy(temp.Chars, VarPtr(Chars[startIndex]), length)
378 Chars[m_Length] = 0
379 Return temp
380 End Function
381
382 Function Remove(startIndex As Long) As Long
383 If startIndex < 0 Or startIndex > m_Length Then Return -1
384 Chars[startIndex] = 0
385 m_Length = startIndex
386 Return m_Length
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
391 If startIndex + count > m_Length Then Return -1
392
393 Dim newChars As *Char
394 newChars = _System_malloc(m_Length - count + 1)
395 If newChars = 0 Then Return -1
396
397 memcpy(newChars, Chars, startIndex)
398 memcpy(newChars + startIndex, Chars + startIndex + count, m_Length - startIndex - count)
399 newChars[m_Length - count] = 0
400
401 _System_free(Chars)
402 Chars = newChars
403 m_Length = m_Length - count
404 Return m_Length
405 End Function
406
407 Function IsNullOrEmpty() As BOOL
408 If m_Length = 0 Then
409 Return _System_TRUE
410 Else
411 Return _System_FALSE
412 End If
413 End Function
414
415
416 Sub Replace(oldChar As Char, newChar As Char)
417 Dim i As Long
418 For i = 0 To ELM(m_Length)
419 If Chars[i] = oldChar Then
420 Chars[i] = newChar
421 End If
422 Next
423 End Sub
424
425 Sub Replace(ByRef oldStr As String, ByRef newStr As String)
426 Replace(oldStr, oldStr.m_Length, newStr, newStr.m_Length)
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
443 .Append(Chars + current, pos - current)
444 .Append(newStr, newLen)
445 current = pos + oldLen
446 Loop
447 .Append(Chars + current, m_Length - current)
448 End With
449 Swap(tempString)
450 End Sub
451
452 Sub ToLower()
453 CharLower(Chars)
454 End Sub
455
456 Sub ToUpper()
457 CharUpper(Chars)
458 End Sub
459
460 Sub Swap(ByRef x As String)
461 Dim tempLen As Long
462 Dim tempChars As PSTR
463 tempLen = x.m_Length
464 tempChars = x.Chars
465 x.m_Length = This.m_Length
466 x.Chars = This.Chars
467 This.m_Length = tempLen
468 This.Chars = tempChars
469 End Sub
470
471 Override Function ToString() As String
472 Return This
473 End Function
474
475Private
476 ' メモリ確保に失敗すると元の文字列は失われない。(例外安全でいう強い保障)
477 Function AllocStringBuffer(textLength As Long) As *Char
478 If textLength < 0 Then
479 Return 0
480 ElseIf textLength > m_Length Then
481 AllocStringBuffer = _System_realloc(Chars, textLength + 1)
482 If AllocStringBuffer <> 0 Then
483 m_Length = textLength
484 Chars = AllocStringBuffer
485 End If
486 Else
487 m_Length = textLength
488 AllocStringBuffer = Chars
489 End If
490 End Function
491
492End Class
493
Note: See TracBrowser for help on using the repository browser.