720
765
* Now set up 'f' as a GSMutableString object whose initial buffer is
721
766
* allocated on the stack. The GSPrivateFormat function can write into it.
723
f.isa = GSMutableStringClass;
724
f._zone = NSDefaultMallocZone();
726
f._capacity = sizeof(buf);
730
GSPrivateFormat(&f, fmt, argList, locale);
768
f = (GSStr)alloca(class_getInstanceSize(GSMutableStringClass));
769
object_setClass(f, GSMutableStringClass);
770
f->_zone = NSDefaultMallocZone();
771
f->_contents.c = buf;
772
f->_capacity = sizeof(buf);
776
GSPrivateFormat(f, fmt, argList, locale);
779
NSZoneFree(NSDefaultMallocZone(), fmt);
737
* Don't use noCopy because f._contents.u may be memory on the stack,
738
* and even if it wasn't f._capacity may be greater than f._count so
783
* Don't use noCopy because f->_contents.u may be memory on the stack,
784
* and even if it wasn't f->_capacity may be greater than f->_count so
739
785
* we could be wasting quite a bit of space. Better to accept a
740
786
* performance hit due to copying data (and allocating/deallocating
741
787
* the temporary buffer) for large strings. For most strings, the
742
788
* on-stack memory will have been used, so we will get better performance.
744
if (f._flags.wide == 1)
790
if (f->_flags.wide == 1)
746
792
me = (GSStr)NSAllocateObject(GSUnicodeInlineStringClass,
747
f._count*sizeof(unichar), GSObjCZone(self));
748
me->_contents.u = (unichar*)&((GSUnicodeInlineString*)me)[1];
749
me->_count = f._count;
793
f->_count*sizeof(unichar), [self zone]);
794
me->_contents.u = (unichar*)
795
(((void*)me)+class_getInstanceSize(GSUnicodeInlineStringClass));
796
me->_count = f->_count;
750
797
me->_flags.wide = 1;
751
me->_flags.free = 1; // Ignored on dealloc, but means we own buffer
752
memcpy(me->_contents.u, f._contents.u, f._count*sizeof(unichar));
798
me->_flags.owned = 1; // Ignored on dealloc, but means we own buffer
799
memcpy(me->_contents.u, f->_contents.u, f->_count*sizeof(unichar));
756
me = (GSStr)NSAllocateObject(GSCInlineStringClass, f._count,
758
me->_contents.c = (unsigned char*)&((GSCInlineString*)me)[1];
759
me->_count = f._count;
803
me = (GSStr)NSAllocateObject(GSCInlineStringClass, f->_count,
805
me->_contents.c = (unsigned char*)
806
(((void*)me)+class_getInstanceSize(GSCInlineStringClass));
807
me->_count = f->_count;
760
808
me->_flags.wide = 0;
761
me->_flags.free = 1; // Ignored on dealloc, but means we own buffer
762
memcpy(me->_contents.c, f._contents.c, f._count);
809
me->_flags.owned = 1; // Ignored on dealloc, but means we own buffer
810
memcpy(me->_contents.c, f->_contents.c, f->_count);
766
814
* If the string had to grow beyond the initial buffer size, we must
767
815
* release any allocated memory.
769
if (f._flags.free == 1)
817
if (f->_flags.owned == 1)
771
NSZoneFree(f._zone, f._contents.c);
819
NSZoneFree(f->_zone, f->_contents.c);
4491
@interface NSImmutableString: NSString
4495
- (id) initWithString: (NSString*)parent;
4498
@interface GSImmutableString: NSImmutableString
4501
@implementation NSImmutableString
4503
- (BOOL) canBeConvertedToEncoding: (NSStringEncoding)enc
4505
return [_parent canBeConvertedToEncoding: enc];
4508
- (unichar) characterAtIndex: (unsigned int)index
4510
return [_parent characterAtIndex: index];
4513
- (NSComparisonResult) compare: (NSString*)aString
4514
options: (unsigned int)mask
4515
range: (NSRange)aRange
4517
return [_parent compare: aString options: mask range: aRange];
4520
- (const char *) cString
4522
return [_parent cString];
4525
- (const char *) cStringUsingEncoding
4527
return [_parent cStringUsingEncoding];
4530
- (unsigned int) cStringLength
4532
return [_parent cStringLength];
4535
- (NSData*) dataUsingEncoding: (NSStringEncoding)encoding
4536
allowLossyConversion: (BOOL)flag
4538
return [_parent dataUsingEncoding: encoding allowLossyConversion: flag];
4547
- (id) copyWithZone: (NSZone*)z
4549
return [_parent copyWithZone: z];
4554
return [_parent mutableCopy];
4557
- (id) mutableCopyWithZone: (NSZone*)z
4559
return [_parent mutableCopyWithZone: z];
4562
- (void) encodeWithCoder: (NSCoder*)aCoder
4564
[_parent encodeWithCoder: aCoder];
4567
- (NSStringEncoding) fastestEncoding
4569
return [_parent fastestEncoding];
4572
- (void) getCharacters: (unichar*)buffer
4574
[_parent getCharacters: buffer];
4577
- (void) getCharacters: (unichar*)buffer range: (NSRange)aRange
4579
[_parent getCharacters: buffer range: aRange];
4582
- (void) getCString: (char*)buffer
4584
[_parent getCString: buffer];
4587
- (void) getCString: (char*)buffer
4588
maxLength: (unsigned int)maxLength
4590
[_parent getCString: buffer maxLength: maxLength];
4593
- (BOOL) getCString: (char*)buffer
4594
maxLength: (unsigned int)maxLength
4595
encoding: (NSStringEncoding)encoding
4597
return [_parent getCString: buffer maxLength: maxLength encoding: encoding];
4600
- (void) getCString: (char*)buffer
4601
maxLength: (unsigned int)maxLength
4602
range: (NSRange)aRange
4603
remainingRange: (NSRange*)leftoverRange
4605
[_parent getCString: buffer
4606
maxLength: maxLength
4608
remainingRange: leftoverRange];
4613
return [_parent hash];
4616
- (id) initWithString: (NSString*)parent
4618
_parent = RETAIN(parent);
4622
- (BOOL) isEqual: (id)anObject
4624
return [_parent isEqual: anObject];
4627
- (BOOL) isEqualToString: (NSString*)anObject
4629
return [_parent isEqualToString: anObject];
4632
- (unsigned int) length
4634
return [_parent length];
4637
- (unsigned int) lengthOfBytesUsingEncoding
4639
return [_parent lengthOfBytesUsingEncoding];
4642
- (const char*) lossyCString
4644
return [_parent lossyCString];
4647
- (unsigned int) maximumLengthOfBytesUsingEncoding
4649
return [_parent maximumLengthOfBytesUsingEncoding];
4652
- (NSRange) rangeOfComposedCharacterSequenceAtIndex: (unsigned)anIndex
4654
return [_parent rangeOfComposedCharacterSequenceAtIndex: anIndex];
4657
- (NSRange) rangeOfCharacterFromSet: (NSCharacterSet*)aSet
4658
options: (unsigned)mask
4659
range: (NSRange)aRange
4661
GS_RANGE_CHECK(aRange, ((GSStr)_parent)->_count);
4662
return [_parent rangeOfCharacterFromSet: aSet options: mask range: aRange];
4665
- (NSRange) rangeOfString: (NSString*)aString
4666
options: (unsigned)mask
4667
range: (NSRange)aRange
4669
GS_RANGE_CHECK(aRange, ((GSStr)_parent)->_count);
4671
[NSException raise: NSInvalidArgumentException
4672
format: @"[%@ -%@] nil string argument",
4673
NSStringFromClass([self class]), NSStringFromSelector(_cmd)];
4674
if (GSObjCIsInstance(aString) == NO)
4675
[NSException raise: NSInvalidArgumentException
4676
format: @"[%@ -%@] not a string argument",
4677
NSStringFromClass([self class]), NSStringFromSelector(_cmd)];
4678
return [_parent rangeOfString: aString options: mask range: aRange];
4681
- (NSStringEncoding) smallestEncoding
4683
return [_parent smallestEncoding];
4689
@implementation GSImmutableString
4696
- (BOOL) canBeConvertedToEncoding: (NSStringEncoding)enc
4698
if (((GSStr)_parent)->_flags.wide == 1)
4699
return canBeConvertedToEncoding_u((GSStr)_parent, enc);
4701
return canBeConvertedToEncoding_c((GSStr)_parent, enc);
4704
- (unichar) characterAtIndex: (unsigned int)index
4706
if (((GSStr)_parent)->_flags.wide == 1)
4707
return characterAtIndex_u((GSStr)_parent, index);
4709
return characterAtIndex_c((GSStr)_parent, index);
4712
- (NSComparisonResult) compare: (NSString*)aString
4713
options: (unsigned int)mask
4714
range: (NSRange)aRange
4716
GS_RANGE_CHECK(aRange, ((GSStr)_parent)->_count);
4718
[NSException raise: NSInvalidArgumentException
4719
format: @"[%@ -%@] nil string argument",
4720
NSStringFromClass([self class]), NSStringFromSelector(_cmd)];
4721
if (GSObjCIsInstance(aString) == NO)
4722
[NSException raise: NSInvalidArgumentException
4723
format: @"[%@ -%@] not a string argument",
4724
NSStringFromClass([self class]), NSStringFromSelector(_cmd)];
4725
if (((GSStr)_parent)->_flags.wide == 1)
4726
return compare_u((GSStr)_parent, aString, mask, aRange);
4728
return compare_c((GSStr)_parent, aString, mask, aRange);
4731
- (const char *) cString
4733
if (((GSStr)_parent)->_flags.wide == 1)
4734
return cString_u((GSStr)_parent, externalEncoding);
4736
return cString_c((GSStr)_parent, externalEncoding);
4739
- (const char *) cStringUsingEncoding: (NSStringEncoding)encoding
4741
if (((GSStr)_parent)->_flags.wide == 1)
4742
return cString_u((GSStr)_parent, encoding);
4744
return cString_c((GSStr)_parent, encoding);
4747
- (unsigned int) cStringLength
4749
if (((GSStr)_parent)->_flags.wide == 1)
4750
return cStringLength_u((GSStr)_parent, externalEncoding);
4752
return cStringLength_c((GSStr)_parent, externalEncoding);
4755
- (NSData*) dataUsingEncoding: (NSStringEncoding)encoding
4756
allowLossyConversion: (BOOL)flag
4758
if (((GSStr)_parent)->_flags.wide == 1)
4759
return dataUsingEncoding_u((GSStr)_parent, encoding, flag);
4761
return dataUsingEncoding_c((GSStr)_parent, encoding, flag);
4764
- (void) encodeWithCoder: (NSCoder*)aCoder
4766
[_parent encodeWithCoder: aCoder];
4769
- (NSStringEncoding) fastestEncoding
4771
if (((GSStr)_parent)->_flags.wide == 1)
4772
return NSUnicodeStringEncoding;
4774
return internalEncoding;
4777
- (void) getCharacters: (unichar*)buffer
4779
if (((GSStr)_parent)->_flags.wide == 1)
4781
getCharacters_u((GSStr)_parent, buffer,
4782
(NSRange){0, ((GSStr)_parent)->_count});
4786
getCharacters_c((GSStr)_parent, buffer,
4787
(NSRange){0, ((GSStr)_parent)->_count});
4791
- (void) getCharacters: (unichar*)buffer range: (NSRange)aRange
4793
GS_RANGE_CHECK(aRange, ((GSStr)_parent)->_count);
4794
if (((GSStr)_parent)->_flags.wide == 1)
4796
getCharacters_u((GSStr)_parent, buffer, aRange);
4800
getCharacters_c((GSStr)_parent, buffer, aRange);
4806
if (((GSStr)_parent)->_flags.hash == 0)
4808
((GSStr)_parent)->_flags.hash = (*hashImp)((id)_parent, hashSel);
4810
return ((GSStr)_parent)->_flags.hash;
4813
- (BOOL) isEqual: (id)anObject
4815
if (((GSStr)_parent)->_flags.wide == 1)
4816
return isEqual_u((GSStr)_parent, anObject);
4818
return isEqual_c((GSStr)_parent, anObject);
4821
- (BOOL) isEqualToString: (NSString*)anObject
4823
if (((GSStr)_parent)->_flags.wide == 1)
4824
return isEqual_u((GSStr)_parent, anObject);
4826
return isEqual_c((GSStr)_parent, anObject);
4829
- (unsigned int) length
4831
return ((GSStr)_parent)->_count;
4834
- (unsigned int) lengthOfBytesUsingEncoding: (NSStringEncoding)encoding
4836
if (((GSStr)_parent)->_flags.wide == 1)
4837
return cStringLength_u((GSStr)_parent, encoding);
4839
return cStringLength_c((GSStr)_parent, encoding);
4842
- (const char*) lossyCString
4844
if (((GSStr)_parent)->_flags.wide == 1)
4845
return lossyCString_u((GSStr)_parent);
4847
return lossyCString_c((GSStr)_parent);
4850
- (unsigned int) maximumLengthOfBytesUsingEncoding
4852
return [_parent maximumLengthOfBytesUsingEncoding];
4855
- (NSRange) rangeOfComposedCharacterSequenceAtIndex: (unsigned)anIndex
4857
if (((GSStr)_parent)->_flags.wide == 1)
4858
return rangeOfSequence_u((GSStr)_parent, anIndex);
4860
return rangeOfSequence_c((GSStr)_parent, anIndex);
4863
- (NSRange) rangeOfCharacterFromSet: (NSCharacterSet*)aSet
4864
options: (unsigned)mask
4865
range: (NSRange)aRange
4867
GS_RANGE_CHECK(aRange, ((GSStr)_parent)->_count);
4868
if (((GSStr)_parent)->_flags.wide == 1)
4869
return rangeOfCharacter_u((GSStr)_parent, aSet, mask, aRange);
4871
return rangeOfCharacter_c((GSStr)_parent, aSet, mask, aRange);
4874
- (NSRange) rangeOfString: (NSString*)aString
4875
options: (unsigned)mask
4876
range: (NSRange)aRange
4878
GS_RANGE_CHECK(aRange, ((GSStr)_parent)->_count);
4880
[NSException raise: NSInvalidArgumentException
4881
format: @"[%@ -%@] nil string argument",
4882
NSStringFromClass([self class]), NSStringFromSelector(_cmd)];
4883
if (GSObjCIsInstance(aString) == NO)
4884
[NSException raise: NSInvalidArgumentException
4885
format: @"[%@ -%@] not a string argument",
4886
NSStringFromClass([self class]), NSStringFromSelector(_cmd)];
4887
if (((GSStr)_parent)->_flags.wide == 1)
4888
return rangeOfString_u((GSStr)_parent, aString, mask, aRange);
4890
return rangeOfString_c((GSStr)_parent, aString, mask, aRange);
4893
- (NSStringEncoding) smallestEncoding
4895
if (((GSStr)_parent)->_flags.wide == 1)
4897
return NSUnicodeStringEncoding;
4901
return internalEncoding;
4910
4604
* <p>The NXConstantString class is used by the compiler for constant
4911
4605
* strings, as such its ivar layout is determined by the compiler