Class String m_Length As Long Public Chars As LPSTR Sub String() Chars = _System_calloc(1) m_Length = 0 End Sub Sub String(initStr As LPSTR) String() Assign(initStr) End Sub Sub String(ByRef initStr As String) String() Assign(initStr) End Sub /* Sub String(length As Long) ReSize(length) End Sub */ Sub String(initChar As Byte, length As Long) ReSize(length, initChar) End Sub Sub ~String() _System_free(Chars) Chars = 0 #ifdef _DEBUG m_Length = 0 #endif End Sub Function Length() As Long Return m_Length End Function Function Operator() As LPSTR Return Chars End Function Sub Operator = (ByRef objString As String) Assign(objString.Chars, objString.m_Length) End Sub Sub Operator = (text As LPSTR) Assign(text) End Sub Function Operator[] (n As Long) As Byte Return Chars[n] End Function Sub Operator[]= (n As Long, c As Byte) Chars[n] = c End Sub Function Operator+ (lpszText As LPSTR) As String Return Concat(lpszText, lstrlen(lpszText)) End Function Function Operator+ (ByRef objString As String) As String Return Concat(objString, objString.m_Length) End Function Function Operator& (lpszText As LPSTR) As String Dim tempString As String tempString=This+lpszText Return tempString End Function Function Operator& (ByRef objString As String) As String Dim tempString As String tempString=This+objString Return tempString End Function Function Operator== (ByRef objString As String) As Long If lstrcmp(This, objString) = 0 Then Return _System_TRUE Else Return _System_FALSE End If End Function Function Operator== (lpszText As LPSTR) As Long If lstrcmp(This, lpszText) = 0 Then Return _System_TRUE Else Return _System_FALSE End If End Function Function Operator<> (ByRef objString As String) As Long Return lstrcmp(This, objString) End Function Function Operator<> (lpszText As LPSTR) As Long Return lstrcmp(This, lpszText) End Function Function Operator< (ByRef objString As String) As Long If lstrcmp(This, objString) < 0 Then Return _System_TRUE Else Return _System_FALSE End If End Function Function Operator< (lpszText As LPSTR) As Long If lstrcmp(This, lpszText) < 0 Then Return _System_TRUE Else Return _System_FALSE End If End Function Function Operator> (ByRef objString As String) As Long If lstrcmp(This, objString) > 0 Then Return _System_TRUE Else Return _System_FALSE End If End Function Function Operator> (lpszText As LPSTR) As Long If lstrcmp(This, lpszText) > 0 Then Return _System_TRUE Else Return _System_FALSE End If End Function Function Operator<= (ByRef objString As String) As Long If lstrcmp(This, objString) <= 0 Then Return _System_TRUE Else Return _System_FALSE End If End Function Function Operator<= (lpszText As LPSTR) As Long If lstrcmp(This, lpszText) <= 0 Then Return _System_TRUE Else Return _System_FALSE End If End Function Function Operator>= (ByRef objString As String) As Long If lstrcmp(This, objString) => 0 Then Return _System_TRUE Else Return _System_FALSE End If End Function Function Operator>= (lpszText As LPSTR) As Long If lstrcmp(This, lpszText) => 0 Then Return _System_TRUE Else Return _System_FALSE End If End Function Function StrPtr() As LPSTR Return Chars End Function Sub ReSize(allocLength As Long) If allocLength < 0 Then Exit Sub If allocLength > m_Length Then Dim oldLength As Long oldLength = m_Length If AllocStringBuffer(allocLength) <> 0 Then ZeroMemory(Chars + oldLength, m_Length - oldLength + 1) End If Else m_Length = allocLength Chars[m_Length] = 0 End If End Sub Sub ReSize(allocLength As Long, c As Byte) If allocLength < 0 Then Exit Sub ElseIf allocLength > m_Length Then Dim oldLength As Long oldLength = m_Length If AllocStringBuffer(allocLength) <> 0 Then FillMemory(Chars + oldLength, m_Length - oldLength, c) End If Else m_Length = allocLength End If Chars[m_Length] = 0 End Sub Sub Assign(lpszText As LPSTR, textLength As Long) If lpszText = Chars Then Exit Sub If AllocStringBuffer(textLength) <> 0 Then memcpy(Chars, lpszText, textLength) Chars[m_Length] = 0 End If End Sub Sub Assign(ByRef objString As String) Assign(objString.Chars, objString.m_Length) End Sub Sub Assign(lpszText As LPSTR) If lpszText Then Assign(lpszText, lstrlen(lpszText)) Else 'Chars=_System_realloc(Chars,1) Chars[0] = 0 m_Length = 0 End If End Sub Sub Append(lpszText As LPSTR, textLength As Long) Dim prevLen As Long prevLen = m_Length If AllocStringBuffer(m_Length + textLength) <> 0 Then memcpy(Chars + prevLen, lpszText, textLength) Chars[m_Length] = 0 End If End Sub Sub Append(text As LPSTR) Append(text, lstrlen(text)) End Sub Sub Append(ByRef str As String) Append(str.Chars, str.m_Length) End Sub Function Concat(lpszText As LPSTR, textLength As Long) As String Dim tempString As String With tempString .AllocStringBuffer(This.m_Length + textLength) memcpy(.Chars, This.Chars, This.m_Length) memcpy(.Chars + This.m_Length, lpszText, textLength) .Chars[.m_Length] = 0 End With Return tempString End Function Function Contains(ByRef objString As String) As BOOL If IndexOf(objString, 0, m_Length) >= 0 Then Return _System_TRUE Else Return _System_FALSE End If End Function Function Contains(lpszText As LPSTR) As BOOL If IndexOf(lpszText, 0, m_Length) >= 0 Then Return _System_TRUE Else Return _System_FALSE End If End Function Function IndexOf(lpszText As LPSTR) As Long Return IndexOf(lpszText, 0, m_Length) End Function Function IndexOf(lpszText As LPSTR, startIndex As Long) As Long Return IndexOf(lpszText, startIndex, m_Length - startIndex) End Function Function IndexOf(lpszText As LPSTR, startIndex As Long, count As Long) As Long Dim length As Long length = lstrlen(lpszText) If startIndex < 0 Then Return -1 If count < 1 Or count + startIndex > m_Length Then Return -1 If length > m_Length Then Return -1 If length = 0 Then Return startIndex Dim i As Long, j As Long For i = startIndex To startIndex + count - 1 For j = 0 To length - 1 If Chars[i + j] = lpszText[j] Then If j = length - 1 Then Return i Else Exit For End If Next Next Return -1 End Function Function LastIndexOf(lpszText As LPSTR) As Long Return LastIndexOf(lpszText, m_Length - 1, m_Length) End Function Function LastIndexOf(lpszText As LPSTR, startIndex As Long) As Long Return LastIndexOf(lpszText As LPSTR, startIndex, startIndex + 1) End Function Function LastIndexOf(lpszText As LPSTR, startIndex As Long, count As Long) As Long Dim length As Long length = lstrlen(lpszText) If startIndex < 0 Or startIndex > m_Length - 1 Then Return -1 If count < 1 Or count > startIndex + 2 Then Return -1 If length > m_Length Then Return -1 If length = 0 Then Return startIndex Dim i As Long, j As Long For i = startIndex To startIndex - count + 1 Step -1 For j = length - 1 To 0 Step -1 If Chars[i + j] = lpszText[j] Then If j = 0 Then Return i Else Exit For End If Next Next Return -1 End Function Function StartsWith(lpszText As LPSTR) As BOOL If IndexOf(lpszText) = 0 Then Return _System_TRUE Else Return _System_FALSE End If End Function Function EndsWith(lpszText As LPSTR) As BOOL If LastIndexOf(lpszText) = m_Length - lstrlen(lpszText) Then Return _System_TRUE Else Return _System_FALSE End If End Function Function Insert(startIndex As Long, lpszText As LPSTR) As Long Dim length As Long length = lstrlen(lpszText) If startIndex < 0 Or startIndex > m_Length Then Return -1 Dim newChars As LPSTR newChars = _System_malloc(length + m_Length + 1) If newChars = 0 Then Return -1 memcpy(newChars, Chars, startIndex) memcpy(newChars + startIndex, lpszText, length) memcpy(newChars + startIndex + length, Chars + startIndex, m_Length - startIndex + 1) _System_free(Chars) Chars = newChars m_Length = length + m_Length Return m_Length End Function Function SubString(startIndex As Long) As String Return SubString(startIndex, m_Length - startIndex) End Function Function SubString(startIndex As Long, length As Long) As String If startIndex < 0 Or length <= 0 Then Return "" If startIndex + length > m_Length Then Return "" Dim temp As String temp.AllocStringBuffer(length) memcpy(temp.Chars, VarPtr(Chars[startIndex]), length) Chars[m_Length] = 0 Return temp End Function Function Remove(startIndex As Long) As Long If startIndex < 0 Or startIndex > m_Length Then Return -1 Chars[startIndex] = 0 m_Length = startIndex Return m_Length End Function Function Remove(startIndex As Long, count As Long) As Long If startIndex < 0 Or count < 0 Then Return -1 If startIndex + count > m_Length Then Return -1 Dim newChars As LPSTR newChars = _System_malloc(m_Length - count + 1) If newChars = 0 Then Return -1 memcpy(newChars, Chars, startIndex) memcpy(newChars + startIndex, Chars + startIndex + count, m_Length - startIndex - count) newChars[m_Length - count] = 0 _System_free(Chars) Chars = newChars m_Length = m_Length - count Return m_Length End Function Function IsNullOrEmpty() As BOOL If m_Length = 0 Then Return _System_TRUE Else Return _System_FALSE End If End Function Sub Replace(oldChar As Byte, newChar As Byte) Dim i As Long For i = 0 To ELM(m_Length) If Chars[i] = oldChar Then Chars[i] = newChar End If Next End Sub Sub Replace(ByRef oldStr As String, ByRef newStr As String) Replace(oldStr, oldStr.m_Length, newStr, newStr.m_Length) End Sub Sub Replace(oldStr As PCSTR, newStr As PCSTR) Replace(oldStr, lstrlen(oldStr), newStr, lstrlen(newStr)) End Sub Sub Replace(oldStr As PCSTR, oldLen As Long, newStr As PCSTR, newLen As Long) Dim tempString As String With tempString Dim current = 0 As Long Do Dim pos As Long pos = IndexOf(oldStr, current) If pos = -1 Then Exit Do End If .Append(Chars + current, pos - current) .Append(newStr, newLen) current = pos + oldLen Loop .Append(Chars + current, m_Length - current) End With Swap(tempString) End Sub Sub ToLower() CharLower(Chars) End Sub Sub ToUpper() CharUpper(Chars) End Sub Sub Swap(ByRef x As String) Dim tempLen As Long Dim tempChars As PSTR tempLen = x.m_Length tempChars = x.Chars x.m_Length = This.m_Length x.Chars = This.Chars This.m_Length = tempLen This.Chars = tempChars End Sub Private ' メモリ確保に失敗すると元の文字列は失われない。(例外安全でいう強い保障) Function AllocStringBuffer(textLength As Long) As LPSTR If textLength < 0 Then Return 0 ElseIf textLength > m_Length Then AllocStringBuffer = _System_realloc(Chars, textLength + 1) If AllocStringBuffer <> 0 Then m_Length = textLength Chars = AllocStringBuffer End If Else m_Length = textLength AllocStringBuffer = Chars End If End Function End Class