diff --git a/juce_amalgamated.cpp b/juce_amalgamated.cpp index 81de548f2a..dc4ce18dee 100644 --- a/juce_amalgamated.cpp +++ b/juce_amalgamated.cpp @@ -10433,7 +10433,7 @@ public: return text; juce_wchar* const newText = create (b->allocatedNumChars); - memcpy (newText, text, (b->allocatedNumChars + 1) * sizeof (juce_wchar)); + copyChars (newText, text, b->allocatedNumChars); release (b); return newText; @@ -10447,7 +10447,7 @@ public: return text; juce_wchar* const newText = create (jmax (b->allocatedNumChars, numChars)); - memcpy (newText, text, (b->allocatedNumChars + 1) * sizeof (juce_wchar)); + copyChars (newText, text, b->allocatedNumChars); release (b); return newText; @@ -10458,6 +10458,12 @@ public: return bufferFromText (text)->allocatedNumChars; } + static void copyChars (juce_wchar* const dest, const juce_wchar* const src, const size_t numChars) throw() + { + memcpy (dest, src, numChars * sizeof (juce_wchar)); + dest [numChars] = 0; + } + int refCount; size_t allocatedNumChars; juce_wchar text[1]; @@ -10479,7 +10485,7 @@ void String::createInternal (const juce_wchar* const t, const size_t numChars) jassert (t[numChars] == 0); // must have a null terminator text = StringHolder::create (numChars); - memcpy (text, t, (numChars + 1) * sizeof (juce_wchar)); + StringHolder::copyChars (text, t, numChars); } void String::appendInternal (const juce_wchar* const newText, const int numExtraChars) @@ -10490,16 +10496,10 @@ void String::appendInternal (const juce_wchar* const newText, const int numExtra const int newTotalLen = oldLen + numExtraChars; text = StringHolder::makeUniqueWithSize (text, newTotalLen); - memcpy (text + oldLen, newText, numExtraChars * sizeof (juce_wchar)); - text [newTotalLen] = 0; + StringHolder::copyChars (text + oldLen, newText, numExtraChars); } } -void String::dupeInternalIfMultiplyReferenced() -{ - text = StringHolder::makeUnique (text); -} - void String::preallocateStorage (const size_t numChars) { text = StringHolder::makeUniqueWithSize (text, numChars); @@ -10539,6 +10539,13 @@ String::String (const size_t numChars, const int /*dummyVariable*/) { } +String::String (const String& stringToCopy, const size_t charsToAllocate) +{ + const size_t otherSize = StringHolder::getAllocatedNumChars (stringToCopy.text); + text = StringHolder::create (jmax (charsToAllocate, otherSize)); + StringHolder::copyChars (text, stringToCopy.text, otherSize); +} + String::String (const char* const t) { if (t != 0 && *t != 0) @@ -10559,7 +10566,7 @@ String::String (const juce_wchar* const t) { const int len = CharacterFunctions::length (t); text = StringHolder::create (len); - memcpy (text, t, (len + 1) * sizeof (juce_wchar)); + StringHolder::copyChars (text, t, len); } else { @@ -10596,8 +10603,7 @@ String::String (const juce_wchar* const t, const size_t maxChars) if (i > 0) { text = StringHolder::create (i); - memcpy (text, t, i * sizeof (juce_wchar)); - text[i] = 0; + StringHolder::copyChars (text, t, i); } else { @@ -11413,13 +11419,11 @@ const String String::repeatedString (const juce_wchar* const stringToRepeat, int { const int len = CharacterFunctions::length (stringToRepeat); String result ((size_t) (len * numberOfTimesToRepeat + 1), (int) 0); - juce_wchar* n = result.text; - n[0] = 0; while (--numberOfTimesToRepeat >= 0) { - CharacterFunctions::append (n, stringToRepeat); + StringHolder::copyChars (n, stringToRepeat, len); n += len; } @@ -11431,21 +11435,17 @@ const String String::paddedLeft (const juce_wchar padCharacter, int minimumLengt jassert (padCharacter != 0); const int len = length(); - if (len >= minimumLength || padCharacter == 0) return *this; String result ((size_t) minimumLength + 1, (int) 0); - juce_wchar* n = result.text; minimumLength -= len; while (--minimumLength >= 0) *n++ = padCharacter; - *n = 0; - CharacterFunctions::append (n, text); - + StringHolder::copyChars (n, text, len); return result; } @@ -11453,11 +11453,19 @@ const String String::paddedRight (const juce_wchar padCharacter, int minimumLeng { jassert (padCharacter != 0); - const int paddingNeeded = minimumLength - length(); - if (paddingNeeded <= 0 || padCharacter == 0) + const int len = length(); + if (len >= minimumLength || padCharacter == 0) return *this; - return *this + String::empty.paddedLeft (padCharacter, paddingNeeded); + String result (*this, (size_t) minimumLength); + juce_wchar* n = result.text + len; + + minimumLength -= len; + while (--minimumLength >= 0) + *n++ = padCharacter; + + *n = 0; + return result; } const String String::replaceSection (int index, int numCharsToReplace, @@ -11499,21 +11507,17 @@ const String String::replaceSection (int index, int numCharsToReplace, String result ((size_t) newTotalLen, (int) 0); - memcpy (result.text, text, index * sizeof (juce_wchar)); + StringHolder::copyChars (result.text, text, index); if (newStringLen > 0) - memcpy (result.text + index, - stringToInsert, - newStringLen * sizeof (juce_wchar)); + StringHolder::copyChars (result.text + index, stringToInsert, newStringLen); const int endStringLen = newTotalLen - (index + newStringLen); if (endStringLen > 0) - memcpy (result.text + (index + newStringLen), - text + (index + numCharsToReplace), - endStringLen * sizeof (juce_wchar)); - - result.text [newTotalLen] = 0; + StringHolder::copyChars (result.text + (index + newStringLen), + text + (index + numCharsToReplace), + endStringLen); return result; } @@ -11545,9 +11549,7 @@ const String String::replaceCharacter (const juce_wchar charToReplace, const juc if (index < 0) return *this; - String result (*this); - result.dupeInternalIfMultiplyReferenced(); - + String result (*this, size_t()); juce_wchar* t = result.text + index; while (*t != 0) @@ -11564,9 +11566,7 @@ const String String::replaceCharacter (const juce_wchar charToReplace, const juc const String String::replaceCharacters (const String& charactersToReplace, const juce_wchar* const charactersToInsertInstead) const { - String result (*this); - result.dupeInternalIfMultiplyReferenced(); - + String result (*this, size_t()); juce_wchar* t = result.text; const int len2 = CharacterFunctions::length (charactersToInsertInstead); @@ -11639,16 +11639,14 @@ bool String::endsWithIgnoreCase (const juce_wchar* const other) const throw() const String String::toUpperCase() const { - String result (*this); - result.dupeInternalIfMultiplyReferenced(); + String result (*this, size_t()); CharacterFunctions::toUpperCase (result.text); return result; } const String String::toLowerCase() const { - String result (*this); - result.dupeInternalIfMultiplyReferenced(); + String result (*this, size_t()); CharacterFunctions::toLowerCase (result.text); return result; } @@ -11656,9 +11654,7 @@ const String String::toLowerCase() const juce_wchar& String::operator[] (const int index) { jassert (((unsigned int) index) <= (unsigned int) length()); - - dupeInternalIfMultiplyReferenced(); - + text = StringHolder::makeUnique (text); return text [index]; } @@ -11777,7 +11773,7 @@ const String String::unquoted() const { String s (*this); - if (s[0] == T('"') || s[0] == T('\'')) + if (s.text[0] == T('"') || s.text[0] == T('\'')) s = s.substring (1); const int lastCharIndex = s.length() - 1; @@ -12440,9 +12436,7 @@ int String::copyToCString (char* destBuffer, const int maxBufferSizeBytes) const void String::copyToUnicode (juce_wchar* const destBuffer, const int maxCharsToCopy) const throw() { - const int len = jmin (maxCharsToCopy, length()); - memcpy (destBuffer, text, len * sizeof (juce_wchar)); - destBuffer [len] = 0; + StringHolder::copyChars (destBuffer, text, jmin (maxCharsToCopy, length())); } String::Concatenator::Concatenator (String& stringToAppendTo) @@ -14125,7 +14119,7 @@ namespace XmlOutputFunctions } } - static void writeSpaces (OutputStream& out, int numSpaces) throw() + static void writeSpaces (OutputStream& out, int numSpaces) { if (numSpaces > 0) { @@ -14145,7 +14139,7 @@ namespace XmlOutputFunctions void XmlElement::writeElementAsText (OutputStream& outputStream, const int indentationLevel, - const int lineWrapLength) const throw() + const int lineWrapLength) const { using namespace XmlOutputFunctions; writeSpaces (outputStream, indentationLevel); @@ -14265,7 +14259,7 @@ const String XmlElement::createDocument (const String& dtdToUse, const bool allOnOneLine, const bool includeXmlHeader, const String& encodingType, - const int lineWrapLength) const throw() + const int lineWrapLength) const { MemoryOutputStream mem (2048, 4096); writeToStream (mem, dtdToUse, allOnOneLine, includeXmlHeader, encodingType, lineWrapLength); @@ -14278,7 +14272,7 @@ void XmlElement::writeToStream (OutputStream& output, const bool allOnOneLine, const bool includeXmlHeader, const String& encodingType, - const int lineWrapLength) const throw() + const int lineWrapLength) const { if (includeXmlHeader) { @@ -14306,7 +14300,7 @@ void XmlElement::writeToStream (OutputStream& output, bool XmlElement::writeToFile (const File& file, const String& dtdToUse, const String& encodingType, - const int lineWrapLength) const throw() + const int lineWrapLength) const { if (file.hasWriteAccess()) { @@ -14418,8 +14412,22 @@ bool XmlElement::hasAttribute (const String& attributeName) const throw() return false; } -const String XmlElement::getStringAttribute (const String& attributeName, - const String& defaultReturnValue) const throw() +const String& XmlElement::getStringAttribute (const String& attributeName) const throw() +{ + const XmlAttributeNode* att = attributes; + + while (att != 0) + { + if (att->name.equalsIgnoreCase (attributeName)) + return att->value; + + att = att->next; + } + + return String::empty; +} + +const String XmlElement::getStringAttribute (const String& attributeName, const String& defaultReturnValue) const { const XmlAttributeNode* att = attributes; @@ -14434,8 +14442,7 @@ const String XmlElement::getStringAttribute (const String& attributeName, return defaultReturnValue; } -int XmlElement::getIntAttribute (const String& attributeName, - const int defaultReturnValue) const throw() +int XmlElement::getIntAttribute (const String& attributeName, const int defaultReturnValue) const { const XmlAttributeNode* att = attributes; @@ -14450,8 +14457,7 @@ int XmlElement::getIntAttribute (const String& attributeName, return defaultReturnValue; } -double XmlElement::getDoubleAttribute (const String& attributeName, - const double defaultReturnValue) const throw() +double XmlElement::getDoubleAttribute (const String& attributeName, const double defaultReturnValue) const { const XmlAttributeNode* att = attributes; @@ -14466,8 +14472,7 @@ double XmlElement::getDoubleAttribute (const String& attributeName, return defaultReturnValue; } -bool XmlElement::getBoolAttribute (const String& attributeName, - const bool defaultReturnValue) const throw() +bool XmlElement::getBoolAttribute (const String& attributeName, const bool defaultReturnValue) const { const XmlAttributeNode* att = attributes; @@ -14515,8 +14520,7 @@ bool XmlElement::compareAttribute (const String& attributeName, return false; } -void XmlElement::setAttribute (const String& attributeName, - const String& value) throw() +void XmlElement::setAttribute (const String& attributeName, const String& value) { #ifdef JUCE_DEBUG // check the identifier being passed in is legal.. @@ -14557,14 +14561,12 @@ void XmlElement::setAttribute (const String& attributeName, } } -void XmlElement::setAttribute (const String& attributeName, - const int number) throw() +void XmlElement::setAttribute (const String& attributeName, const int number) { setAttribute (attributeName, String (number)); } -void XmlElement::setAttribute (const String& attributeName, - const double number) throw() +void XmlElement::setAttribute (const String& attributeName, const double number) { setAttribute (attributeName, String (number)); } @@ -70202,18 +70204,9 @@ public: if (! screenArea.contains (lastScreenPos)) { - const Point compPos (current->getScreenPosition()); - int deltaX = 0, deltaY = 0; - - if (lastScreenPos.getX() <= screenArea.getX() || lastScreenPos.getX() >= screenArea.getRight()) - deltaX = compPos.getX() + current->getWidth() / 2 - lastScreenPos.getX(); - - if (lastScreenPos.getY() <= screenArea.getY() || lastScreenPos.getY() >= screenArea.getBottom()) - deltaY = compPos.getY() + current->getHeight() / 2 - lastScreenPos.getY(); - - const Point delta (deltaX, deltaY); - unboundedMouseOffset -= delta; - Desktop::setMousePosition (lastScreenPos + delta); + const Point componentCentre (current->getScreenBounds().getCentre()); + unboundedMouseOffset += (lastScreenPos - componentCentre); + Desktop::setMousePosition (componentCentre); } else if (isCursorVisibleUntilOffscreen && (! unboundedMouseOffset.isOrigin()) diff --git a/juce_amalgamated.h b/juce_amalgamated.h index 895165ce78..03f775c9e9 100644 --- a/juce_amalgamated.h +++ b/juce_amalgamated.h @@ -1365,10 +1365,10 @@ private: // internal constructor that preallocates a certain amount of memory String (size_t numChars, int dummyVariable); + String (const String& stringToCopy, size_t charsToAllocate); void createInternal (const juce_wchar* text, size_t numChars); void appendInternal (const juce_wchar* text, int numExtraChars); - void dupeInternalIfMultiplyReferenced(); }; const String JUCE_CALLTYPE operator+ (const char* string1, const String& string2); @@ -4456,19 +4456,19 @@ public: const bool allOnOneLine = false, const bool includeXmlHeader = true, const String& encodingType = JUCE_T("UTF-8"), - const int lineWrapLength = 60) const throw(); + const int lineWrapLength = 60) const; void writeToStream (OutputStream& output, const String& dtdToUse, const bool allOnOneLine = false, const bool includeXmlHeader = true, const String& encodingType = JUCE_T("UTF-8"), - const int lineWrapLength = 60) const throw(); + const int lineWrapLength = 60) const; bool writeToFile (const File& destinationFile, const String& dtdToUse, const String& encodingType = JUCE_T("UTF-8"), - const int lineWrapLength = 60) const throw(); + const int lineWrapLength = 60) const; inline const String& getTagName() const throw() { return tagName; } @@ -4484,30 +4484,32 @@ public: bool hasAttribute (const String& attributeName) const throw(); + const String& getStringAttribute (const String& attributeName) const throw(); + const String getStringAttribute (const String& attributeName, - const String& defaultReturnValue = String::empty) const throw(); + const String& defaultReturnValue) const; bool compareAttribute (const String& attributeName, const String& stringToCompareAgainst, const bool ignoreCase = false) const throw(); int getIntAttribute (const String& attributeName, - const int defaultReturnValue = 0) const throw(); + const int defaultReturnValue = 0) const; double getDoubleAttribute (const String& attributeName, - const double defaultReturnValue = 0.0) const throw(); + const double defaultReturnValue = 0.0) const; bool getBoolAttribute (const String& attributeName, - const bool defaultReturnValue = false) const throw(); + const bool defaultReturnValue = false) const; void setAttribute (const String& attributeName, - const String& newValue) throw(); + const String& newValue); void setAttribute (const String& attributeName, - const int newValue) throw(); + const int newValue); void setAttribute (const String& attributeName, - const double newValue) throw(); + const double newValue); void removeAttribute (const String& attributeName) throw(); @@ -4609,7 +4611,7 @@ private: void writeElementAsText (OutputStream& out, const int indentationLevel, - const int lineWrapLength) const throw(); + const int lineWrapLength) const; void getChildElementsAsArray (XmlElement**) const throw(); void reorderChildElements (XmlElement** const, const int) throw(); diff --git a/src/gui/components/mouse/juce_MouseInputSource.cpp b/src/gui/components/mouse/juce_MouseInputSource.cpp index f919643c38..9cc7512282 100644 --- a/src/gui/components/mouse/juce_MouseInputSource.cpp +++ b/src/gui/components/mouse/juce_MouseInputSource.cpp @@ -382,18 +382,9 @@ public: if (! screenArea.contains (lastScreenPos)) { - const Point compPos (current->getScreenPosition()); - int deltaX = 0, deltaY = 0; - - if (lastScreenPos.getX() <= screenArea.getX() || lastScreenPos.getX() >= screenArea.getRight()) - deltaX = compPos.getX() + current->getWidth() / 2 - lastScreenPos.getX(); - - if (lastScreenPos.getY() <= screenArea.getY() || lastScreenPos.getY() >= screenArea.getBottom()) - deltaY = compPos.getY() + current->getHeight() / 2 - lastScreenPos.getY(); - - const Point delta (deltaX, deltaY); - unboundedMouseOffset -= delta; - Desktop::setMousePosition (lastScreenPos + delta); + const Point componentCentre (current->getScreenBounds().getCentre()); + unboundedMouseOffset += (lastScreenPos - componentCentre); + Desktop::setMousePosition (componentCentre); } else if (isCursorVisibleUntilOffscreen && (! unboundedMouseOffset.isOrigin()) diff --git a/src/text/juce_String.cpp b/src/text/juce_String.cpp index bb058f33f2..3b0cb57a9a 100644 --- a/src/text/juce_String.cpp +++ b/src/text/juce_String.cpp @@ -93,7 +93,7 @@ public: return text; juce_wchar* const newText = create (b->allocatedNumChars); - memcpy (newText, text, (b->allocatedNumChars + 1) * sizeof (juce_wchar)); + copyChars (newText, text, b->allocatedNumChars); release (b); return newText; @@ -107,7 +107,7 @@ public: return text; juce_wchar* const newText = create (jmax (b->allocatedNumChars, numChars)); - memcpy (newText, text, (b->allocatedNumChars + 1) * sizeof (juce_wchar)); + copyChars (newText, text, b->allocatedNumChars); release (b); return newText; @@ -118,6 +118,12 @@ public: return bufferFromText (text)->allocatedNumChars; } + static void copyChars (juce_wchar* const dest, const juce_wchar* const src, const size_t numChars) throw() + { + memcpy (dest, src, numChars * sizeof (juce_wchar)); + dest [numChars] = 0; + } + //============================================================================== int refCount; size_t allocatedNumChars; @@ -141,7 +147,7 @@ void String::createInternal (const juce_wchar* const t, const size_t numChars) jassert (t[numChars] == 0); // must have a null terminator text = StringHolder::create (numChars); - memcpy (text, t, (numChars + 1) * sizeof (juce_wchar)); + StringHolder::copyChars (text, t, numChars); } void String::appendInternal (const juce_wchar* const newText, const int numExtraChars) @@ -152,16 +158,10 @@ void String::appendInternal (const juce_wchar* const newText, const int numExtra const int newTotalLen = oldLen + numExtraChars; text = StringHolder::makeUniqueWithSize (text, newTotalLen); - memcpy (text + oldLen, newText, numExtraChars * sizeof (juce_wchar)); - text [newTotalLen] = 0; + StringHolder::copyChars (text + oldLen, newText, numExtraChars); } } -void String::dupeInternalIfMultiplyReferenced() -{ - text = StringHolder::makeUnique (text); -} - void String::preallocateStorage (const size_t numChars) { text = StringHolder::makeUniqueWithSize (text, numChars); @@ -202,6 +202,13 @@ String::String (const size_t numChars, const int /*dummyVariable*/) { } +String::String (const String& stringToCopy, const size_t charsToAllocate) +{ + const size_t otherSize = StringHolder::getAllocatedNumChars (stringToCopy.text); + text = StringHolder::create (jmax (charsToAllocate, otherSize)); + StringHolder::copyChars (text, stringToCopy.text, otherSize); +} + String::String (const char* const t) { if (t != 0 && *t != 0) @@ -222,7 +229,7 @@ String::String (const juce_wchar* const t) { const int len = CharacterFunctions::length (t); text = StringHolder::create (len); - memcpy (text, t, (len + 1) * sizeof (juce_wchar)); + StringHolder::copyChars (text, t, len); } else { @@ -259,8 +266,7 @@ String::String (const juce_wchar* const t, const size_t maxChars) if (i > 0) { text = StringHolder::create (i); - memcpy (text, t, i * sizeof (juce_wchar)); - text[i] = 0; + StringHolder::copyChars (text, t, i); } else { @@ -1085,13 +1091,11 @@ const String String::repeatedString (const juce_wchar* const stringToRepeat, int { const int len = CharacterFunctions::length (stringToRepeat); String result ((size_t) (len * numberOfTimesToRepeat + 1), (int) 0); - juce_wchar* n = result.text; - n[0] = 0; while (--numberOfTimesToRepeat >= 0) { - CharacterFunctions::append (n, stringToRepeat); + StringHolder::copyChars (n, stringToRepeat, len); n += len; } @@ -1103,21 +1107,17 @@ const String String::paddedLeft (const juce_wchar padCharacter, int minimumLengt jassert (padCharacter != 0); const int len = length(); - if (len >= minimumLength || padCharacter == 0) return *this; String result ((size_t) minimumLength + 1, (int) 0); - juce_wchar* n = result.text; minimumLength -= len; while (--minimumLength >= 0) *n++ = padCharacter; - *n = 0; - CharacterFunctions::append (n, text); - + StringHolder::copyChars (n, text, len); return result; } @@ -1125,11 +1125,19 @@ const String String::paddedRight (const juce_wchar padCharacter, int minimumLeng { jassert (padCharacter != 0); - const int paddingNeeded = minimumLength - length(); - if (paddingNeeded <= 0 || padCharacter == 0) + const int len = length(); + if (len >= minimumLength || padCharacter == 0) return *this; - return *this + String::empty.paddedLeft (padCharacter, paddingNeeded); + String result (*this, (size_t) minimumLength); + juce_wchar* n = result.text + len; + + minimumLength -= len; + while (--minimumLength >= 0) + *n++ = padCharacter; + + *n = 0; + return result; } //============================================================================== @@ -1172,21 +1180,17 @@ const String String::replaceSection (int index, int numCharsToReplace, String result ((size_t) newTotalLen, (int) 0); - memcpy (result.text, text, index * sizeof (juce_wchar)); + StringHolder::copyChars (result.text, text, index); if (newStringLen > 0) - memcpy (result.text + index, - stringToInsert, - newStringLen * sizeof (juce_wchar)); + StringHolder::copyChars (result.text + index, stringToInsert, newStringLen); const int endStringLen = newTotalLen - (index + newStringLen); if (endStringLen > 0) - memcpy (result.text + (index + newStringLen), - text + (index + numCharsToReplace), - endStringLen * sizeof (juce_wchar)); - - result.text [newTotalLen] = 0; + StringHolder::copyChars (result.text + (index + newStringLen), + text + (index + numCharsToReplace), + endStringLen); return result; } @@ -1218,9 +1222,7 @@ const String String::replaceCharacter (const juce_wchar charToReplace, const juc if (index < 0) return *this; - String result (*this); - result.dupeInternalIfMultiplyReferenced(); - + String result (*this, size_t()); juce_wchar* t = result.text + index; while (*t != 0) @@ -1237,9 +1239,7 @@ const String String::replaceCharacter (const juce_wchar charToReplace, const juc const String String::replaceCharacters (const String& charactersToReplace, const juce_wchar* const charactersToInsertInstead) const { - String result (*this); - result.dupeInternalIfMultiplyReferenced(); - + String result (*this, size_t()); juce_wchar* t = result.text; const int len2 = CharacterFunctions::length (charactersToInsertInstead); @@ -1314,16 +1314,14 @@ bool String::endsWithIgnoreCase (const juce_wchar* const other) const throw() //============================================================================== const String String::toUpperCase() const { - String result (*this); - result.dupeInternalIfMultiplyReferenced(); + String result (*this, size_t()); CharacterFunctions::toUpperCase (result.text); return result; } const String String::toLowerCase() const { - String result (*this); - result.dupeInternalIfMultiplyReferenced(); + String result (*this, size_t()); CharacterFunctions::toLowerCase (result.text); return result; } @@ -1332,9 +1330,7 @@ const String String::toLowerCase() const juce_wchar& String::operator[] (const int index) { jassert (((unsigned int) index) <= (unsigned int) length()); - - dupeInternalIfMultiplyReferenced(); - + text = StringHolder::makeUnique (text); return text [index]; } @@ -1453,7 +1449,7 @@ const String String::unquoted() const { String s (*this); - if (s[0] == T('"') || s[0] == T('\'')) + if (s.text[0] == T('"') || s.text[0] == T('\'')) s = s.substring (1); const int lastCharIndex = s.length() - 1; @@ -2124,9 +2120,7 @@ int String::copyToCString (char* destBuffer, const int maxBufferSizeBytes) const //============================================================================== void String::copyToUnicode (juce_wchar* const destBuffer, const int maxCharsToCopy) const throw() { - const int len = jmin (maxCharsToCopy, length()); - memcpy (destBuffer, text, len * sizeof (juce_wchar)); - destBuffer [len] = 0; + StringHolder::copyChars (destBuffer, text, jmin (maxCharsToCopy, length())); } diff --git a/src/text/juce_String.h b/src/text/juce_String.h index 73a21c5fbe..7c1ce520be 100644 --- a/src/text/juce_String.h +++ b/src/text/juce_String.h @@ -1026,10 +1026,10 @@ private: //============================================================================== // internal constructor that preallocates a certain amount of memory String (size_t numChars, int dummyVariable); + String (const String& stringToCopy, size_t charsToAllocate); void createInternal (const juce_wchar* text, size_t numChars); void appendInternal (const juce_wchar* text, int numExtraChars); - void dupeInternalIfMultiplyReferenced(); }; //============================================================================== diff --git a/src/text/juce_XmlElement.cpp b/src/text/juce_XmlElement.cpp index 517fff1c89..dddb9b8ce5 100644 --- a/src/text/juce_XmlElement.cpp +++ b/src/text/juce_XmlElement.cpp @@ -246,7 +246,7 @@ namespace XmlOutputFunctions } } - static void writeSpaces (OutputStream& out, int numSpaces) throw() + static void writeSpaces (OutputStream& out, int numSpaces) { if (numSpaces > 0) { @@ -266,7 +266,7 @@ namespace XmlOutputFunctions void XmlElement::writeElementAsText (OutputStream& outputStream, const int indentationLevel, - const int lineWrapLength) const throw() + const int lineWrapLength) const { using namespace XmlOutputFunctions; writeSpaces (outputStream, indentationLevel); @@ -386,7 +386,7 @@ const String XmlElement::createDocument (const String& dtdToUse, const bool allOnOneLine, const bool includeXmlHeader, const String& encodingType, - const int lineWrapLength) const throw() + const int lineWrapLength) const { MemoryOutputStream mem (2048, 4096); writeToStream (mem, dtdToUse, allOnOneLine, includeXmlHeader, encodingType, lineWrapLength); @@ -399,7 +399,7 @@ void XmlElement::writeToStream (OutputStream& output, const bool allOnOneLine, const bool includeXmlHeader, const String& encodingType, - const int lineWrapLength) const throw() + const int lineWrapLength) const { if (includeXmlHeader) { @@ -427,7 +427,7 @@ void XmlElement::writeToStream (OutputStream& output, bool XmlElement::writeToFile (const File& file, const String& dtdToUse, const String& encodingType, - const int lineWrapLength) const throw() + const int lineWrapLength) const { if (file.hasWriteAccess()) { @@ -542,8 +542,22 @@ bool XmlElement::hasAttribute (const String& attributeName) const throw() } //============================================================================== -const String XmlElement::getStringAttribute (const String& attributeName, - const String& defaultReturnValue) const throw() +const String& XmlElement::getStringAttribute (const String& attributeName) const throw() +{ + const XmlAttributeNode* att = attributes; + + while (att != 0) + { + if (att->name.equalsIgnoreCase (attributeName)) + return att->value; + + att = att->next; + } + + return String::empty; +} + +const String XmlElement::getStringAttribute (const String& attributeName, const String& defaultReturnValue) const { const XmlAttributeNode* att = attributes; @@ -558,8 +572,7 @@ const String XmlElement::getStringAttribute (const String& attributeName, return defaultReturnValue; } -int XmlElement::getIntAttribute (const String& attributeName, - const int defaultReturnValue) const throw() +int XmlElement::getIntAttribute (const String& attributeName, const int defaultReturnValue) const { const XmlAttributeNode* att = attributes; @@ -574,8 +587,7 @@ int XmlElement::getIntAttribute (const String& attributeName, return defaultReturnValue; } -double XmlElement::getDoubleAttribute (const String& attributeName, - const double defaultReturnValue) const throw() +double XmlElement::getDoubleAttribute (const String& attributeName, const double defaultReturnValue) const { const XmlAttributeNode* att = attributes; @@ -590,8 +602,7 @@ double XmlElement::getDoubleAttribute (const String& attributeName, return defaultReturnValue; } -bool XmlElement::getBoolAttribute (const String& attributeName, - const bool defaultReturnValue) const throw() +bool XmlElement::getBoolAttribute (const String& attributeName, const bool defaultReturnValue) const { const XmlAttributeNode* att = attributes; @@ -640,8 +651,7 @@ bool XmlElement::compareAttribute (const String& attributeName, } //============================================================================== -void XmlElement::setAttribute (const String& attributeName, - const String& value) throw() +void XmlElement::setAttribute (const String& attributeName, const String& value) { #ifdef JUCE_DEBUG // check the identifier being passed in is legal.. @@ -682,14 +692,12 @@ void XmlElement::setAttribute (const String& attributeName, } } -void XmlElement::setAttribute (const String& attributeName, - const int number) throw() +void XmlElement::setAttribute (const String& attributeName, const int number) { setAttribute (attributeName, String (number)); } -void XmlElement::setAttribute (const String& attributeName, - const double number) throw() +void XmlElement::setAttribute (const String& attributeName, const double number) { setAttribute (attributeName, String (number)); } diff --git a/src/text/juce_XmlElement.h b/src/text/juce_XmlElement.h index 5a9512adce..fbaefa4fc6 100644 --- a/src/text/juce_XmlElement.h +++ b/src/text/juce_XmlElement.h @@ -193,7 +193,7 @@ public: const bool allOnOneLine = false, const bool includeXmlHeader = true, const String& encodingType = JUCE_T("UTF-8"), - const int lineWrapLength = 60) const throw(); + const int lineWrapLength = 60) const; /** Writes the document to a stream as UTF-8. @@ -215,7 +215,7 @@ public: const bool allOnOneLine = false, const bool includeXmlHeader = true, const String& encodingType = JUCE_T("UTF-8"), - const int lineWrapLength = 60) const throw(); + const int lineWrapLength = 60) const; /** Writes the element to a file as an XML document. @@ -239,7 +239,7 @@ public: bool writeToFile (const File& destinationFile, const String& dtdToUse, const String& encodingType = JUCE_T("UTF-8"), - const int lineWrapLength = 60) const throw(); + const int lineWrapLength = 60) const; //============================================================================== /** Returns this element's tag type name. @@ -291,6 +291,14 @@ public: /** Checks whether the element contains an attribute with a certain name. */ bool hasAttribute (const String& attributeName) const throw(); + /** Returns the value of a named attribute. + + @param attributeName the name of the attribute to look up + @param defaultReturnValue a value to return if the element doesn't have an attribute + with this name + */ + const String& getStringAttribute (const String& attributeName) const throw(); + /** Returns the value of a named attribute. @param attributeName the name of the attribute to look up @@ -298,7 +306,7 @@ public: with this name */ const String getStringAttribute (const String& attributeName, - const String& defaultReturnValue = String::empty) const throw(); + const String& defaultReturnValue) const; /** Compares the value of a named attribute with a value passed-in. @@ -323,7 +331,7 @@ public: @see setAttribute */ int getIntAttribute (const String& attributeName, - const int defaultReturnValue = 0) const throw(); + const int defaultReturnValue = 0) const; /** Returns the value of a named attribute as floating-point. @@ -336,7 +344,7 @@ public: @see setAttribute */ double getDoubleAttribute (const String& attributeName, - const double defaultReturnValue = 0.0) const throw(); + const double defaultReturnValue = 0.0) const; /** Returns the value of a named attribute as a boolean. @@ -349,7 +357,7 @@ public: with this name */ bool getBoolAttribute (const String& attributeName, - const bool defaultReturnValue = false) const throw(); + const bool defaultReturnValue = false) const; /** Adds a named attribute to the element. @@ -365,7 +373,7 @@ public: @see removeAttribute */ void setAttribute (const String& attributeName, - const String& newValue) throw(); + const String& newValue); /** Adds a named attribute to the element, setting it to an integer value. @@ -380,7 +388,7 @@ public: @param newValue the value to set it to */ void setAttribute (const String& attributeName, - const int newValue) throw(); + const int newValue); /** Adds a named attribute to the element, setting it to a floating-point value. @@ -395,7 +403,7 @@ public: @param newValue the value to set it to */ void setAttribute (const String& attributeName, - const double newValue) throw(); + const double newValue); /** Removes a named attribute from the element. @@ -704,7 +712,7 @@ private: void writeElementAsText (OutputStream& out, const int indentationLevel, - const int lineWrapLength) const throw(); + const int lineWrapLength) const; void getChildElementsAsArray (XmlElement**) const throw(); void reorderChildElements (XmlElement** const, const int) throw();