Some fixes, added the missing operator[], switched to BeOS debug macros,

Implemented the missing Replace functions. Just ReplaceSet is missing
(tests coming)


git-svn-id: file:///srv/svn/repos/haiku/trunk/current@1483 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Stefano Ceccherini
2002-10-11 15:08:38 +00:00
parent 6b2bd871b1
commit 9a125bf5e0
+117 -52
View File
@@ -28,12 +28,13 @@
// Standard Includes ----------------------------------------------------------- // Standard Includes -----------------------------------------------------------
#include <algobase.h> #include <algobase.h>
#include <assert.h>
#include <ctype.h> #include <ctype.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
// System Includes ------------------------------------------------------------- // System Includes -------------------------------------------------------------
#include <Debug.h>
#define DEBUG 1
#include <String.h> #include <String.h>
// Temporary Includes // Temporary Includes
@@ -531,7 +532,9 @@ BString::MoveInto(char *into, int32 from, int32 length)
/*---- Compare functions ---------------------------------------------------*/ /*---- Compare functions ---------------------------------------------------*/
// Implemented inline in the header file
// These are implemented inline in the header file
/*---- strcmp-style compare functions --------------------------------------*/ /*---- strcmp-style compare functions --------------------------------------*/
int int
BString::Compare(const BString &string) const BString::Compare(const BString &string) const
@@ -768,6 +771,9 @@ BString::Replace(char replaceThis, char withThis, int32 maxReplaceCount, int32 f
int32 replaceCount = 0; int32 replaceCount = 0;
char tmp[2] = { replaceThis, '\0' }; char tmp[2] = { replaceThis, '\0' };
if (maxReplaceCount <= 0)
return *this;
while ((pos = _FindAfter(tmp, fromOffset, -1)) >= 0) { while ((pos = _FindAfter(tmp, fromOffset, -1)) >= 0) {
_privateData[pos] = withThis; _privateData[pos] = withThis;
fromOffset += pos; fromOffset += pos;
@@ -831,7 +837,7 @@ BString::ReplaceAll(const char *replaceThis, const char *withThis, int32 fromOff
int32 difference = len - strlen(replaceThis); int32 difference = len - strlen(replaceThis);
int32 pos; int32 pos;
while ((pos = _FindAfter(replaceThis, fromOffset, -1))>= 0) { while ((pos = _FindAfter(replaceThis, fromOffset, -1)) >= 0) {
if (difference > 0) if (difference > 0)
_OpenAtBy(pos, difference); _OpenAtBy(pos, difference);
else if (difference < 0) else if (difference < 0)
@@ -847,7 +853,25 @@ BString::ReplaceAll(const char *replaceThis, const char *withThis, int32 fromOff
BString& BString&
BString::Replace(const char *replaceThis, const char *withThis, int32 maxReplaceCount, int32 fromOffset) BString::Replace(const char *replaceThis, const char *withThis, int32 maxReplaceCount, int32 fromOffset)
{ {
//TODO: Implement if (replaceThis == NULL || maxReplaceCount <= 0)
return *this;
int32 replaceCount = 0;
int32 len = (withThis ? strlen(withThis) : 0);
int32 difference = len - strlen(replaceThis);
int32 pos;
while ((pos = _FindAfter(replaceThis, fromOffset, -1)) >= 0) {
if (difference > 0)
_OpenAtBy(pos, difference);
else if (difference < 0)
_ShrinkAtBy(pos, -difference);
memcpy(_privateData + pos, withThis, len);
fromOffset += pos;
if (++replaceCount == maxReplaceCount)
break;
}
return *this; return *this;
} }
@@ -893,7 +917,20 @@ BString::IReplaceAll(char replaceThis, char withThis, int32 fromOffset)
BString& BString&
BString::IReplace(char replaceThis, char withThis, int32 maxReplaceCount, int32 fromOffset) BString::IReplace(char replaceThis, char withThis, int32 maxReplaceCount, int32 fromOffset)
{ {
//TODO: Implement int32 pos = B_ERROR;
int32 replaceCount = 0;
char tmp[2] = { replaceThis, '\0' };
if (_privateData == NULL || maxReplaceCount <= 0)
return *this;
while ((pos = _FindAfter(tmp, fromOffset, -1)) >= 0) {
_privateData[pos] = withThis;
fromOffset += pos;
if (++replaceCount == maxReplaceCount)
break;
}
return *this; return *this;
} }
@@ -904,11 +941,11 @@ BString::IReplaceFirst(const char *replaceThis, const char *withThis)
if (replaceThis == NULL) if (replaceThis == NULL)
return *this; return *this;
int32 len = (withThis ? strlen(withThis) : 0);
int32 difference = len - strlen(replaceThis);
int32 pos = _IFindAfter(replaceThis, 0, -1); int32 pos = _IFindAfter(replaceThis, 0, -1);
if (pos >= 0) { if (pos >= 0) {
int32 len = (withThis ? strlen(withThis) : 0);
int32 difference = len - strlen(replaceThis);
if (difference > 0) if (difference > 0)
_OpenAtBy(pos, difference); _OpenAtBy(pos, difference);
else if (difference < 0) else if (difference < 0)
@@ -926,11 +963,11 @@ BString::IReplaceLast(const char *replaceThis, const char *withThis)
if (replaceThis == NULL) if (replaceThis == NULL)
return *this; return *this;
int32 len = (withThis ? strlen(withThis) : 0);
int32 difference = len - strlen(replaceThis);
int32 pos = _FindBefore(replaceThis, Length(), -1); int32 pos = _FindBefore(replaceThis, Length(), -1);
if (pos >= 0) { if (pos >= 0) {
int32 len = (withThis ? strlen(withThis) : 0);
int32 difference = len - strlen(replaceThis);
if (difference > 0) if (difference > 0)
_OpenAtBy(pos, difference); _OpenAtBy(pos, difference);
else if (difference < 0) else if (difference < 0)
@@ -968,7 +1005,25 @@ BString::IReplaceAll(const char *replaceThis, const char *withThis, int32 fromOf
BString& BString&
BString::IReplace(const char *replaceThis, const char *withThis, int32 maxReplaceCount, int32 fromOffset) BString::IReplace(const char *replaceThis, const char *withThis, int32 maxReplaceCount, int32 fromOffset)
{ {
//TODO: Implement if (replaceThis == NULL || maxReplaceCount <= 0)
return *this;
int32 replaceCount = 0;
int32 len = (withThis ? strlen(withThis) : 0);
int32 difference = len - strlen(replaceThis);
int32 pos;
while ((pos = _IFindAfter(replaceThis, fromOffset, -1)) >= 0) {
if (difference > 0)
_OpenAtBy(pos, difference);
else if (difference < 0)
_ShrinkAtBy(pos, -difference);
memcpy(_privateData + pos, withThis, len);
fromOffset += pos;
if (++replaceCount == maxReplaceCount)
break;
}
return *this; return *this;
} }
@@ -976,8 +1031,9 @@ BString::IReplace(const char *replaceThis, const char *withThis, int32 maxReplac
BString& BString&
BString::ReplaceSet(const char *setOfChars, char with) BString::ReplaceSet(const char *setOfChars, char with)
{ {
int32 pos = Length(); int32 pos;
while ((pos = strcspn(String(), setOfChars)) < Length()) int32 length = Length();
while ((pos = strcspn(String(), setOfChars)) < length)
_privateData[pos] = with; _privateData[pos] = with;
return *this; return *this;
} }
@@ -991,12 +1047,24 @@ BString::ReplaceSet(const char *setOfChars, const char *with)
} }
/*---- Unchecked char access -----------------------------------------------*/
char &
BString::operator[](int32 index)
{
return _privateData[index];
}
/*---- Fast low-level manipulation -----------------------------------------*/ /*---- Fast low-level manipulation -----------------------------------------*/
char* char*
BString::LockBuffer(int32 maxLength) BString::LockBuffer(int32 maxLength)
{ {
if (maxLength > Length()) _SetUsingAsCString(true); //debug
_privateData = _GrowBy(maxLength - Length());
int32 len = Length();
if (maxLength > len)
_privateData = _GrowBy(maxLength - len);
return _privateData; return _privateData;
} }
@@ -1005,6 +1073,8 @@ BString::LockBuffer(int32 maxLength)
BString& BString&
BString::UnlockBuffer(int32 length) BString::UnlockBuffer(int32 length)
{ {
_SetUsingAsCString(false); //debug
int32 len = length; int32 len = length;
if (len < 0) if (len < 0)
@@ -1066,6 +1136,7 @@ BString::CapitalizeEachWord()
int32 length = Length(); int32 length = Length();
do { do {
// Find the first alphabetical character
for(; count < length; count++) { for(; count < length; count++) {
if (isalpha(_privateData[count])) { if (isalpha(_privateData[count])) {
_privateData[count] = toupper(_privateData[count]); _privateData[count] = toupper(_privateData[count]);
@@ -1073,6 +1144,8 @@ BString::CapitalizeEachWord()
break; break;
} }
} }
// Find the first non-alphabetical character,
// and meanwhile, turn to lowercase all the alphabetical ones
for(; count < length; count++) { for(; count < length; count++) {
if (isalpha(_privateData[count])) if (isalpha(_privateData[count]))
_privateData[count] = tolower(_privateData[count]); _privateData[count] = tolower(_privateData[count]);
@@ -1089,22 +1162,8 @@ BString::CapitalizeEachWord()
BString& BString&
BString::CharacterEscape(const char *original, const char *setOfCharsToEscape, char escapeWith) BString::CharacterEscape(const char *original, const char *setOfCharsToEscape, char escapeWith)
{ {
if (original == NULL || setOfCharsToEscape == NULL || _privateData == NULL) SetTo(original);
return *this; CharacterEscape(setOfCharsToEscape, escapeWith);
_DoAssign(original, strlen(original));
int32 pos, offset = 0;
for(;;) {
pos = strcspn(_privateData + offset, setOfCharsToEscape);
offset += pos;
if (offset >= Length())
break;
_OpenAtBy(offset, 1);
memset(_privateData + offset, escapeWith, 1);
offset+=2;
}
return *this; return *this;
} }
@@ -1125,7 +1184,7 @@ BString::CharacterEscape(const char *setOfCharsToEscape, char escapeWith)
break; break;
_OpenAtBy(offset, 1); _OpenAtBy(offset, 1);
memset(_privateData + offset, escapeWith, 1); memset(_privateData + offset, escapeWith, 1);
offset+=2; offset += 2;
} }
return *this; return *this;
@@ -1135,13 +1194,8 @@ BString::CharacterEscape(const char *setOfCharsToEscape, char escapeWith)
BString& BString&
BString::CharacterDeescape(const char *original, char escapeChar) BString::CharacterDeescape(const char *original, char escapeChar)
{ {
if (original == NULL || _privateData == NULL) SetTo(original);
return *this; CharacterDeescape(escapeChar);
_DoAssign(original, strlen(original));
char tmp[2] = { escapeChar, '\0' };
RemoveAll(tmp);
return *this; return *this;
} }
@@ -1261,7 +1315,7 @@ BString::operator<<(float f)
void void
BString::_Init(const char* str, int32 len) BString::_Init(const char* str, int32 len)
{ {
assert(str != NULL); ASSERT(str != NULL);
_privateData = _GrowBy(len); _privateData = _GrowBy(len);
memcpy(_privateData, str, len); memcpy(_privateData, str, len);
} }
@@ -1270,7 +1324,7 @@ BString::_Init(const char* str, int32 len)
void void
BString::_DoAssign(const char *str, int32 len) BString::_DoAssign(const char *str, int32 len)
{ {
assert(str != NULL); ASSERT(str != NULL);
int32 curLen = Length(); int32 curLen = Length();
if (len != curLen) if (len != curLen)
@@ -1283,7 +1337,7 @@ BString::_DoAssign(const char *str, int32 len)
void void
BString::_DoAppend(const char *str, int32 len) BString::_DoAppend(const char *str, int32 len)
{ {
assert(str != NULL); ASSERT(str != NULL);
int32 length = Length(); int32 length = Length();
_privateData = _GrowBy(len); _privateData = _GrowBy(len);
@@ -1295,7 +1349,7 @@ char*
BString::_GrowBy(int32 size) BString::_GrowBy(int32 size)
{ {
int32 curLen = Length(); int32 curLen = Length();
assert(curLen + size >= 0); ASSERT(curLen + size >= 0);
if (_privateData) { if (_privateData) {
_privateData -= sizeof(int32); _privateData -= sizeof(int32);
@@ -1316,13 +1370,16 @@ BString::_GrowBy(int32 size)
char* char*
BString::_OpenAtBy(int32 offset, int32 length) BString::_OpenAtBy(int32 offset, int32 length)
{ {
assert(offset >= 0); ASSERT(offset >= 0);
int32 oldLength = Length(); int32 oldLength = Length();
if (_privateData != NULL) if (_privateData != NULL)
_privateData -= sizeof(int32); _privateData -= sizeof(int32);
_privateData = (char*)realloc(_privateData , oldLength + length + sizeof(int32) + 1); _privateData = (char*)realloc(_privateData , oldLength + length + sizeof(int32) + 1);
_privateData += sizeof(int32); _privateData += sizeof(int32);
memmove(_privateData + offset + length, _privateData + offset, memmove(_privateData + offset + length, _privateData + offset,
oldLength - offset); oldLength - offset);
@@ -1336,7 +1393,8 @@ BString::_OpenAtBy(int32 offset, int32 length)
char* char*
BString::_ShrinkAtBy(int32 offset, int32 length) BString::_ShrinkAtBy(int32 offset, int32 length)
{ {
assert(offset + length <= Length()); ASSERT(offset + length <= Length());
int32 oldLength = Length(); int32 oldLength = Length();
memmove(_privateData + offset, _privateData + offset + length, memmove(_privateData + offset, _privateData + offset + length,
@@ -1356,7 +1414,7 @@ BString::_ShrinkAtBy(int32 offset, int32 length)
void void
BString::_DoPrepend(const char *str, int32 count) BString::_DoPrepend(const char *str, int32 count)
{ {
assert(str != NULL); ASSERT(str != NULL);
_privateData = _OpenAtBy(0, count); _privateData = _OpenAtBy(0, count);
memcpy(_privateData, str, count); memcpy(_privateData, str, count);
} }
@@ -1399,9 +1457,9 @@ BString::_IFindAfter(const char *str, int32 offset, int32 ) const
int32 int32
BString::_ShortFindAfter(const char *str, int32 ) const BString::_ShortFindAfter(const char *str, int32) const
{ {
assert(str != NULL); ASSERT(str != NULL);
//TODO: Implement? //TODO: Implement?
return B_ERROR; return B_ERROR;
} }
@@ -1467,10 +1525,17 @@ BString::_SetLength(int32 length)
#if DEBUG #if DEBUG
// TODO: Implement?
// AFAIK, these are not implemented in BeOS R5 // AFAIK, these are not implemented in BeOS R5
BString::_SetUsingAsCString(bool) {} void
BString::_AssertNotUsingAsCString() {} BString::_SetUsingAsCString(bool state)
{
}
void
BString::_AssertNotUsingAsCString() const
{
}
#endif #endif