From e1b32b96e9bd2c8b272add60e73747afc50acff8 Mon Sep 17 00:00:00 2001 From: richard Date: Fri, 17 Mar 2000 08:49:46 +0000 Subject: [PATCH] Minor range check fixes git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@6295 72102866-910b-0410-8b05-ffd578937521 --- ChangeLog | 6 ++++++ Source/NSGCString.m | 52 ++++++++++++++++++++++++++++----------------- Source/NSGString.m | 45 ++++++++++++++++++++++++--------------- 3 files changed, 66 insertions(+), 37 deletions(-) diff --git a/ChangeLog b/ChangeLog index e1759cb9e..6b537d713 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Fri Mar 17 07:47:00 2000 Richard Frith-Macdonald + + * Source/NSGString.m: Add checks to safely (and more efficiently) + handle deletion and insertion of zero-length ranges. + * Source/NSGCString.m: ditto. + Thu Mar 16 11:37:00 2000 Richard Frith-Macdonald * Source/NSRange.m: NSRangeFromString() bugfix by karl@nfox.com diff --git a/Source/NSGCString.m b/Source/NSGCString.m index a237112eb..2fee4a8b8 100644 --- a/Source/NSGCString.m +++ b/Source/NSGCString.m @@ -849,39 +849,51 @@ static inline void stringIncrementCountAndMakeHoleAt(NSGMutableCStringStruct *self, int index, int size) { + if (size > 0) + { + if (self->_count > 0) + { #ifndef STABLE_MEMCPY - { - unsigned i = self->_count; + unsigned i = self->_count; - while (i-- > index) - self->_contents_chars[i+size] = self->_contents_chars[i]; - } + while (i-- > index) + { + self->_contents_chars[i+size] = self->_contents_chars[i]; + } #else - memcpy(self->_contents_chars + index, - self->_contents_chars + index + size, - self->_count - index); + memcpy(self->_contents_chars + index, + self->_contents_chars + index + size, + self->_count - index); #endif /* STABLE_MEMCPY */ - (self->_count) += size; - (self->_hash) = 0; + } + self->_count += size; + self->_hash = 0; + } } static inline void stringDecrementCountAndFillHoleAt(NSGMutableCStringStruct *self, int index, int size) { - (self->_count) -= size; + if (size > 0) + { + self->_count -= size; #ifndef STABLE_MEMCPY - { - int i; - for (i = index; i <= self->_count; i++) - self->_contents_chars[i] = self->_contents_chars[i+size]; - } + { + int i; + + for (i = index; i <= self->_count; i++) + { + self->_contents_chars[i] = self->_contents_chars[i+size]; + } + } #else - memcpy(self->_contents_chars + index + size, - self->_contents_chars + index, - self->_count - index); + memcpy(self->_contents_chars + index + size, + self->_contents_chars + index, + self->_count - index); #endif /* STABLE_MEMCPY */ - (self->_hash) = 0; + self->_hash = 0; + } } /* This is the designated initializer for this class */ diff --git a/Source/NSGString.m b/Source/NSGString.m index b1a52cd41..86a639981 100644 --- a/Source/NSGString.m +++ b/Source/NSGString.m @@ -536,47 +536,58 @@ static inline void stringIncrementCountAndMakeHoleAt(NSGMutableStringStruct *self, int index, int size) { - if (self->_count || size) + if (size > 0) + { + if (self->_count > 0) { NSCAssert(index+size<=self->_count,@"index+size>length"); NSCAssert(self->_count+size<=self->_capacity,@"length+size>capacity"); #ifndef STABLE_MEMCPY { - int i; - for (i = self->_count; i >= index; i--) - self->_contents_chars[i+size] = self->_contents_chars[i]; + int i; + + for (i = self->_count; i >= index; i--) + { + self->_contents_chars[i+size] = self->_contents_chars[i]; + } } #else - memcpy(self->_contents_chars + index, - self->_contents_chars + index + size, - 2*(self->_count - index)); + memcpy(self->_contents_chars + index, + self->_contents_chars + index + size, 2*(self->_count - index)); #endif /* STABLE_MEMCPY */ - (self->_count) += size; - }; - (self->_hash) = 0; + self->_count += size; + } + self->_hash = 0; + } } static inline void stringDecrementCountAndFillHoleAt(NSGMutableStringStruct *self, int index, int size) { - if (self->_count || size) + if (size > 0) + { + if (self->_count > 0) { NSCAssert(index+size<=self->_count,@"index+size>length"); - (self->_count) -= size; + self->_count -= size; #ifndef STABLE_MEMCPY { - int i; - for (i = index; i <= self->_count; i++) - self->_contents_chars[i] = self->_contents_chars[i+size]; + int i; + + for (i = index; i <= self->_count; i++) + { + self->_contents_chars[i] = self->_contents_chars[i+size]; + } } #else memcpy(self->_contents_chars + index + size, self->_contents_chars + index, 2*(self->_count - index)); #endif // STABLE_MEMCPY - }; - (self->_hash) = 0; + } + self->_hash = 0; + } } // Initializing Newly Allocated Strings