Proprtylist extensions and coding for DO improvements plus a couple of

bugfixes


git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@3492 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
Richard Frith-MacDonald 1998-12-18 17:05:44 +00:00
parent 1848e94aa8
commit 27ec3838e8
17 changed files with 567 additions and 574 deletions

View file

@ -1,3 +1,22 @@
Fri Dec 18 18:15:00 1998 Richard Frith-Macdonald <richard@brainstorm.co.uk>
Foundation.h: Added NSPathUtilities.h
NSObject.h: Added GNUstep specific methods for describing a
property-list to a stream.
NSDate.h: Moved natural language methods to right place.
NSObject.m: Added GNUstep specific extensions for describing a
property-list to a stream, updated -description to spec.
NSProxy.m: Tidied format and description method.
NSArray.m: Added GNUstep specific extensions for describing a
property-list to a stream.
NSDictionary.m: ditto
NSAttributedString.m: Tidied ([-replacementObjectForPortCoder:])
NSGAttributedString.m: ditto
NSGCString.m: ditto
NSGString.m: ditto
NSString.m: ditto
NSConcreteNumber.m: Added ([-replacementObjectForPortCoder:])
Thu Dec 17 16:12:18 1998 Matthias Klose <doko@cs.tu-berlin.de>
* {,*}/GNUmakefile: Include Version and GNUmakefile.local where

View file

@ -60,6 +60,7 @@
#include <Foundation/NSMethodSignature.h>
#include <Foundation/NSNotification.h>
#include <Foundation/NSNotificationQueue.h>
#include <Foundation/NSPathUtilities.h>
#include <Foundation/NSPortCoder.h>
#include <Foundation/NSPortMessage.h>
#include <Foundation/NSPortNameServer.h>

View file

@ -94,6 +94,7 @@
indent: (unsigned int)level;
- (BOOL) writeToFile: (NSString*)path atomically: (BOOL)useAuxilliaryFile;
@end

View file

@ -88,6 +88,13 @@ typedef double NSTimeInterval;
- (BOOL) isEqualToDate: (NSDate*)otherDate;
- (NSDate*) laterDate: (NSDate*)otherDate;
#ifndef STRICT_OPENSTEP
+ (id) dateWithNaturalLanguageString: (NSString *)string;
+ (id) dateWithNaturalLanguageString: (NSString *)string
locale: (NSDictionary *)localeDictionary;
- (id) initWithTimeIntervalSince1970: (NSTimeInterval)seconds;
#endif
@end
@ -112,13 +119,6 @@ typedef double NSTimeInterval;
+ (NSArray *)timeZoneArray;
- (NSArray *)timeZoneDetailArray;
#ifndef STRICT_OPENSTEP
+ (id) dateWithNaturalLanguageString: (NSString *)string;
+ (id) dateWithNaturalLanguageString: (NSString *)string
locale: (NSDictionary *)localeDictionary;
- (id) initWithTimeIntervalSince1970: (NSTimeInterval)seconds;
#endif
#ifndef NO_GNUSTEP
/* Returns an dictionary that maps abbreviations to the array
containing all the time zone names that use the abbreviation. */

View file

@ -43,8 +43,10 @@
@class NSArchiver;
@class NSArray;
@class NSCoder;
@class NSDictionary;
@class NSPortCoder;
@class NSMethodSignature;
@class NSMutableString;
@class NSRecursiveLock;
@class NSString;
@class NSInvocation;
@ -162,8 +164,24 @@ enum {NSNotFound = 0x7fffffff};
creating the potential for deadlock. */
extern NSRecursiveLock *gnustep_global_lock;
/*
* The GNUDescriptionDestination protocol declares a single method used
* to append a property-list description string to some output destination
* so that property-lists can be converted to strings in a stream avoiding
* the use of ridiculous amounts of memory for deeply nested data structures.
*/
@protocol GNUDescriptionDestination
- (void) appendString: (NSString*)str;
@end
@interface NSObject (GNU)
- (int) compare: anObject;
- (void) descriptionTo: (id<GNUDescriptionDestination>)output;
- (void) descriptionWithLocale: (NSDictionary*)aLocale
to: (id<GNUDescriptionDestination>)output;
- (void) descriptionWithLocale: (NSDictionary*)aLocale
indent: (unsigned)level
to: (id<GNUDescriptionDestination>)output;
- (Class)transmuteClassTo:(Class)aClassObject;
- subclassResponsibility:(SEL)aSel;
- shouldNotImplement:(SEL)aSel;

View file

@ -36,20 +36,21 @@
unsigned int _retain_count;
}
+ alloc;
+ allocWithZone: (NSZone*)zone;
+ (id) alloc;
+ (id) allocWithZone: (NSZone*)zone;
+ (Class) class;
+ (void) load;
+ (BOOL) respondsToSelector: (SEL)aSelector;
- (void) dealloc;
- (NSString*) description;
- (void) forwardInvocation: (NSInvocation*)anInvocation;
- methodSignatureForSelector: (SEL)aSelector;
- (NSMethodSignature*) methodSignatureForSelector: (SEL)aSelector;
@end
@interface NSProxy(GNUstepExtensions)
- forward: (SEL)aSel :(arglist_t)frame;
- (id) forward: (SEL)aSel :(arglist_t)frame;
@end
@interface Object (IsProxy)

View file

@ -265,7 +265,6 @@ enum {
#ifndef NO_GNUSTEP
- (BOOL) boolValue;
- (NSString*) descriptionForPropertyList;
- (id) initWithCharactersNoCopy: (unichar*)chars
length: (unsigned int)length
fromZone: (NSZone*)zone;

View file

@ -37,6 +37,8 @@
#include <Foundation/NSException.h>
#include <Foundation/NSAutoreleasePool.h>
#include <gnustep/base/fast.x>
@class NSArrayEnumerator;
@class NSArrayEnumeratorReverse;
@ -603,113 +605,90 @@ static Class NSMutableArray_concrete_class;
- (NSString*) descriptionWithLocale: (NSDictionary*)locale
indent: (unsigned int)level
{
NSMutableString *result;
unsigned size;
unsigned indentSize;
unsigned indentBase;
NSMutableString *iBaseString;
NSMutableString *iSizeString;
NSAutoreleasePool *arp = [NSAutoreleasePool new];
unsigned count = [self count];
NSString *plists[count];
unsigned i;
NSMutableString *result;
[self getObjects: plists];
result = [NSMutableString stringWithCapacity: 20*[self count]];
[self descriptionWithLocale: locale
indent: level
to: (id<GNUDescriptionDestination>)result];
return result;
}
/*
* Indentation is at four space intervals using tab characters to
* replace multiples of eight spaces.
*
* We work out the sizes of the strings needed to perform indentation for
* this level and build strings to make up the indentation.
*/
indentBase = level << 2;
count = indentBase >> 3;
if ((indentBase % 8) == 0) {
indentBase = count;
}
else {
indentBase == count + 4;
}
iBaseString = [NSMutableString stringWithCapacity: indentBase];
for (i = 0; i < count; i++) {
[iBaseString appendString: @"\t"];
}
if (count != indentBase) {
[iBaseString appendString: @" "];
}
static NSString *indentStrings[] = {
@"",
@" ",
@"\t",
@"\t ",
@"\t\t",
@"\t\t ",
@"\t\t\t",
@"\t\t\t ",
@"\t\t\t\t",
@"\t\t\t\t ",
@"\t\t\t\t\t",
@"\t\t\t\t\t ",
@"\t\t\t\t\t\t"
};
level++;
indentSize = level << 2;
count = indentSize >> 3;
if ((indentSize % 8) == 0) {
indentSize = count;
}
else {
indentSize == count + 4;
}
iSizeString = [NSMutableString stringWithCapacity: indentSize];
for (i = 0; i < count; i++) {
[iSizeString appendString: @"\t"];
}
if (count != indentSize) {
[iSizeString appendString: @" "];
}
- (void) descriptionWithLocale: (NSDictionary*)locale
indent: (unsigned int)level
to: (id<GNUDescriptionDestination>)result
{
NSString *iBaseString;
NSString *iSizeString;
unsigned count = [self count];
NSString *plists[count];
unsigned i;
SEL appSel;
IMP appImp;
/*
* Basic size is - opening bracket, newline, closing bracket,
* indentation for the closing bracket, and a nul terminator.
*/
size = 4 + indentBase;
appSel = @selector(appendString:);
appImp = [(NSObject*)result methodForSelector: appSel];
count = [self count];
for (i = 0; i < count; i++) {
id item;
if (level < sizeof(indentStrings)/sizeof(NSString*))
iBaseString = indentStrings[level];
else
iBaseString = indentStrings[sizeof(indentStrings)/sizeof(NSString*)-1];
level++;
if (level < sizeof(indentStrings)/sizeof(NSString*))
iSizeString = indentStrings[level];
else
iSizeString = indentStrings[sizeof(indentStrings)/sizeof(NSString*)-1];
item = plists[i];
if ([item isKindOfClass: [NSString class]]) {
item = [item descriptionForPropertyList];
(*appImp)(result, appSel, @"(\n");
[self getObjects: plists];
for (i = 0; i < count; i++)
{
id item = plists[i];
(*appImp)(result, appSel, iSizeString);
if ([item respondsToSelector:
@selector(descriptionWithLocale:indent:)])
{
[item descriptionWithLocale: locale indent: level to: result];
}
else if ([item respondsToSelector:
@selector(descriptionWithLocale:indent:)]) {
item = [item descriptionWithLocale: locale indent: level];
else if ([item respondsToSelector:
@selector(descriptionWithLocale:)])
{
[item descriptionWithLocale: locale to: result];
}
else if ([item respondsToSelector:
@selector(descriptionWithLocale:)]) {
item = [item descriptionWithLocale: locale];
else
{
[item descriptionTo: result];
}
else {
item = [item description];
if (i == count - 1)
{
(*appImp)(result, appSel, @"\n");
}
plists[i] = item;
size += [item length] + indentSize;
if (i == count - 1) {
size += 1; /* newline */
}
else {
size += 2; /* ',' and newline */
else
{
(*appImp)(result, appSel, @",\n");
}
}
result = [[NSMutableString alloc] initWithCapacity: size];
[result appendString: @"(\n"];
for (i = 0; i < count; i++) {
[result appendString: iSizeString];
[result appendString: plists[i]];
if (i == count - 1) {
[result appendString: @"\n"];
}
else {
[result appendString: @",\n"];
}
}
[result appendString: iBaseString];
[result appendString: @")"];
[arp release];
return [result autorelease];
(*appImp)(result, appSel, iBaseString);
(*appImp)(result, appSel, @")");
}
@end

View file

@ -49,6 +49,7 @@
#include <Foundation/NSGAttributedString.h>
#include <Foundation/NSException.h>
#include <Foundation/NSAutoreleasePool.h>
#include <Foundation/NSPortCoder.h>
@implementation NSAttributedString
@ -113,9 +114,12 @@ static Class NSMutableAttributedString_concrete_class;
{
return [self class];
}
- replacementObjectForPortCoder:(NSPortCoder*)aCoder
- (id) replacementObjectForPortCoder: (NSPortCoder*)aCoder
{
if ([aCoder isByref] == NO)
return self;
return [super replacementObjectForPortCoder: aCoder];
}
//NSCopying protocol

View file

@ -28,6 +28,7 @@
#include <Foundation/NSString.h>
#include <Foundation/NSException.h>
#include <Foundation/NSCoder.h>
#include <Foundation/NSPortCoder.h>
#include <gnustep/base/Coder.h>
/* This file should be run through a preprocessor with the macro TYPE_ORDER
@ -336,6 +337,13 @@
return [self class];
}
- (id) replacementObjectForPortCoder: (NSPortCoder*)aCoder
{
if ([aCoder isByref] == NO)
return self;
return [super replacementObjectForPortCoder: aCoder];
}
- (void) encodeWithCoder: coder
{
const char *type = [self objCType];

View file

@ -527,215 +527,144 @@ compareIt(id o1, id o2, void* context)
- (NSString*) descriptionInStringsFileFormat
{
NSMutableString *result;
int size;
int i;
NSAutoreleasePool *arp = [NSAutoreleasePool new];
NSArray *keysArray = [self allKeys];
int numKeys = [keysArray count];
NSString *plists[numKeys];
NSString *keys[numKeys];
NSMutableString *result = [NSMutableString stringWithCapacity: 1024];
NSEnumerator *enumerator;
id key;
[keysArray getObjects: keys];
enumerator = [self keyEnumerator];
while ((key = [enumerator nextObject]) != nil)
{
id val = [self objectForKey: key];
size = 1;
for (i = 0; i < numKeys; i++) {
NSString *newKey;
id key;
id item;
key = keys[i];
item = [self objectForKey: key];
if ([key respondsToSelector: @selector(descriptionForPropertyList)]) {
newKey = [key descriptionForPropertyList];
}
else {
newKey = [key description];
}
keys[i] = newKey;
if (item == nil) {
item = @"";
}
else if ([item isKindOfClass: [NSString class]]) {
item = [item descriptionForPropertyList];
}
else {
item = [item description];
}
plists[i] = item;
size += [newKey length] + [item length];
if ([item length]) {
size += 5;
}
else {
size += 2;
}
[key descriptionWithLocale: nil
to: (id<GNUDescriptionDestination>)result];
if (val != nil && [val isEqualToString: @""] == NO)
{
[result appendString: @" = "];
[val descriptionWithLocale: nil
to: (id<GNUDescriptionDestination>)result];
}
[result appendString: @";\n"];
}
result = [[NSMutableString alloc] initWithCapacity: size];
for (i = 0; i < numKeys; i++) {
NSString* item = plists[i];
[result appendString: keys[i]];
if ([item length]) {
[result appendString: @" = "];
[result appendString: item];
}
[result appendString: @";\n"];
}
[arp release];
return [result autorelease];
return result;
}
- (NSString*) descriptionWithLocale: (NSDictionary*)locale
{
return [self descriptionWithLocale: locale indent: 0];
return [self descriptionWithLocale: locale indent: 0];
}
- (NSString*) descriptionWithLocale: (NSDictionary*)locale
indent: (unsigned int)level
{
NSMutableString *result;
NSEnumerator *enumerator;
id key;
BOOL canCompare = YES;
int count;
int size;
int indentSize;
int indentBase;
NSMutableString *iBaseString;
NSMutableString *iSizeString;
int i;
NSAutoreleasePool *arp = [NSAutoreleasePool new];
NSArray *keyArray = [self allKeys];
NSMutableArray *theKeys = [NSMutableArray arrayWithArray: keyArray];
int numKeys = [theKeys count];
NSString *plists[numKeys];
NSString *keys[numKeys];
NSMutableString *result;
/*
* Indentation is at four space intervals using tab characters to
* replace multiples of eight spaces.
*
* We work out the sizes of the strings needed to perform indentation for
* this level and build strings to make up the indentation.
*/
indentBase = level << 2;
count = indentBase >> 3;
if ((indentBase % 8) == 0) {
indentBase = count;
}
else {
indentBase == count + 4;
}
iBaseString = [NSMutableString stringWithCapacity: indentBase];
for (i = 0; i < count; i++) {
[iBaseString appendString: @"\t"];
}
if (count != indentBase) {
[iBaseString appendString: @" "];
}
result = [NSMutableString stringWithCapacity: 20*[self count]];
[self descriptionWithLocale: locale
indent: level
to: (id<GNUDescriptionDestination>)result];
return result;
}
level++;
indentSize = level << 2;
count = indentSize >> 3;
if ((indentSize % 8) == 0) {
indentSize = count;
}
else {
indentSize == count + 4;
}
iSizeString = [NSMutableString stringWithCapacity: indentSize];
for (i = 0; i < count; i++) {
[iSizeString appendString: @"\t"];
}
if (count != indentSize) {
[iSizeString appendString: @" "];
}
static NSString *indentStrings[] = {
@"",
@" ",
@"\t",
@"\t ",
@"\t\t",
@"\t\t ",
@"\t\t\t",
@"\t\t\t ",
@"\t\t\t\t",
@"\t\t\t\t ",
@"\t\t\t\t\t",
@"\t\t\t\t\t ",
@"\t\t\t\t\t\t"
};
/*
* Basic size is - opening bracket, newline, closing bracket,
* indentation for the closing bracket, and a nul terminator.
*/
size = 4 + indentBase;
- (void) descriptionWithLocale: (NSDictionary*)locale
indent: (unsigned int)level
to: (id<GNUDescriptionDestination>)result
{
NSEnumerator *enumerator;
id key;
BOOL canCompare = YES;
NSString *iBaseString;
NSString *iSizeString;
int i;
NSArray *keyArray = [self allKeys];
NSMutableArray *theKeys = [NSMutableArray arrayWithArray: keyArray];
int numKeys = [theKeys count];
NSString *plists[numKeys];
NSString *keys[numKeys];
SEL appSel;
IMP appImp;
enumerator = [self keyEnumerator];
while ((key = [enumerator nextObject]) != nil) {
if ([key respondsToSelector: @selector(compare:)] == NO) {
canCompare = NO;
break;
appSel = @selector(appendString:);
appImp = [(NSObject*)result methodForSelector: appSel];
if (level < sizeof(indentStrings)/sizeof(NSString*))
iBaseString = indentStrings[level];
else
iBaseString = indentStrings[sizeof(indentStrings)/sizeof(NSString*)-1];
level++;
if (level < sizeof(indentStrings)/sizeof(NSString*))
iSizeString = indentStrings[level];
else
iSizeString = indentStrings[sizeof(indentStrings)/sizeof(NSString*)-1];
enumerator = [self keyEnumerator];
while ((key = [enumerator nextObject]) != nil)
{
if ([key respondsToSelector: @selector(compare:)] == NO)
{
canCompare = NO;
break;
}
}
if (canCompare) {
[theKeys sortUsingSelector: @selector(compare:)];
if (canCompare)
{
[theKeys sortUsingSelector: @selector(compare:)];
}
[theKeys getObjects: keys];
for (i = 0; i < numKeys; i++) {
NSString *newKey;
id item;
key = keys[i];
item = [self objectForKey: key];
if ([key respondsToSelector: @selector(descriptionForPropertyList)]) {
newKey = [key descriptionForPropertyList];
}
else {
newKey = [key description];
}
keys[i] = newKey;
if ([item isKindOfClass: [NSString class]]) {
item = [item descriptionForPropertyList];
}
else if ([item respondsToSelector:
@selector(descriptionWithLocale:indent:)]) {
item = [item descriptionWithLocale: locale indent: level];
}
else if ([item respondsToSelector:
@selector(descriptionWithLocale:)]) {
item = [item descriptionWithLocale: locale];
}
else {
item = [item description];
}
plists[i] = item;
size += [newKey length] + [item length] + indentSize;
if (i == numKeys - 1) {
size += 4; /* ' = ' and newline */
}
else {
size += 5; /* ' = ' and ';' and newline */
}
[theKeys getObjects: keys];
for (i = 0; i < numKeys; i++)
{
plists[i] = [self objectForKey: keys[i]];
}
result = [[NSMutableString alloc] initWithCapacity: size];
[result appendString: @"{\n"];
for (i = 0; i < numKeys; i++) {
[result appendString: iSizeString];
[result appendString: keys[i]];
[result appendString: @" = "];
[result appendString: plists[i]];
if (i == numKeys - 1) {
[result appendString: @"\n"];
(*appImp)(result, appSel, @"{\n");
for (i = 0; i < numKeys; i++)
{
id item = plists[i];
(*appImp)(result, appSel, iSizeString);
[keys[i] descriptionTo: result];
(*appImp)(result, appSel, @" = ");
if ([item respondsToSelector:
@selector(descriptionWithLocale:indent:)])
{
[item descriptionWithLocale: locale indent: level to: result];
}
else {
[result appendString: @";\n"];
else if ([item respondsToSelector:
@selector(descriptionWithLocale:)])
{
[item descriptionWithLocale: locale to: result];
}
else
{
[item descriptionTo: result];
}
(*appImp)(result, appSel, @";\n");
}
[result appendString: iBaseString];
[result appendString: @"}"];
[arp release];
return [result autorelease];
(*appImp)(result, appSel, iBaseString);
(*appImp)(result, appSel, @"}");
}
@end

View file

@ -156,15 +156,6 @@ NSDictionary *_attributesAtIndexEffectiveRange(
return nil;
}
- (Class) classForPortCoder
{
return [self class];
}
- replacementObjectForPortCoder:(NSPortCoder*)aCoder
{
return self;
}
- (void) encodeWithCoder: aCoder
{
[super encodeWithCoder:aCoder];
@ -221,15 +212,6 @@ NSDictionary *_attributesAtIndexEffectiveRange(
@implementation NSGMutableAttributedString
- (Class) classForPortCoder
{
return [self class];
}
- replacementObjectForPortCoder:(NSPortCoder*)aCoder
{
return self;
}
- (void) encodeWithCoder: aCoder
{
[super encodeWithCoder:aCoder];

View file

@ -161,26 +161,6 @@ static IMP msInitImp; /* designated initialiser for mutable */
}
}
- (Class) classForArchiver
{
return [self class];
}
- (Class) classForCoder
{
return [self class];
}
- (Class) classForPortCoder
{
return [self class];
}
- replacementObjectForPortCoder:(NSPortCoder*)aCoder
{
return self;
}
- (void) encodeWithCoder: aCoder
{
[aCoder encodeValueOfObjCType:@encode(unsigned) at:&_count];
@ -511,88 +491,104 @@ static IMP msInitImp; /* designated initialiser for mutable */
return [self initWithCStringNoCopy: buf length: length fromZone: z];
}
- (NSString*) descriptionForPropertyList
- (void) descriptionTo: (NSMutableString*)output
{
if (_count == 0) {
return @"\"\"";
if (_count == 0)
{
[output appendString: @"\"\""];
}
else {
unsigned i;
unsigned length = _count;
BOOL needQuote = NO;
else
{
unsigned i;
unsigned length = _count;
BOOL needQuote = NO;
for (i = 0; i < _count; i++) {
char val = _contents_chars[i];
for (i = 0; i < _count; i++)
{
char val = _contents_chars[i];
if (isalnum(val)) {
continue;
if (isalnum(val))
{
continue;
}
switch (val) {
case '\a':
case '\b':
case '\t':
case '\r':
case '\n':
case '\v':
case '\f':
case '\\':
case '"' :
length += 1;
break;
switch (val)
{
case '\a':
case '\b':
case '\t':
case '\r':
case '\n':
case '\v':
case '\f':
case '\\':
case '"' :
length += 1;
break;
default:
if (val == ' ' || isprint(val)) {
needQuote = YES;
}
else {
length += 3;
}
break;
default:
if (val == ' ' || isprint(val))
{
needQuote = YES;
}
else
{
length += 3;
}
break;
}
}
if (needQuote || length != _count) {
NSZone *z = fastZone(self);
char *buf = NSZoneMalloc(z, length+3);
char *ptr = buf;
NSString *result;
if (needQuote || length != _count)
{
NSZone *z = fastZone(self);
char *buf = NSZoneMalloc(z, length+3);
char *ptr = buf;
NSString *result;
*ptr++ = '"';
for (i = 0; i < _count; i++) {
char val = _contents_chars[i];
*ptr++ = '"';
for (i = 0; i < _count; i++)
{
char val = _contents_chars[i];
switch (val) {
case '\a': *ptr++ = '\\'; *ptr++ = 'a'; break;
case '\b': *ptr++ = '\\'; *ptr++ = 'b'; break;
case '\t': *ptr++ = '\\'; *ptr++ = 't'; break;
case '\r': *ptr++ = '\\'; *ptr++ = 'r'; break;
case '\n': *ptr++ = '\\'; *ptr++ = 'n'; break;
case '\v': *ptr++ = '\\'; *ptr++ = 'v'; break;
case '\f': *ptr++ = '\\'; *ptr++ = 'f'; break;
case '\\': *ptr++ = '\\'; *ptr++ = '\\'; break;
case '"' : *ptr++ = '\\'; *ptr++ = '"'; break;
switch (val)
{
case '\a': *ptr++ = '\\'; *ptr++ = 'a'; break;
case '\b': *ptr++ = '\\'; *ptr++ = 'b'; break;
case '\t': *ptr++ = '\\'; *ptr++ = 't'; break;
case '\r': *ptr++ = '\\'; *ptr++ = 'r'; break;
case '\n': *ptr++ = '\\'; *ptr++ = 'n'; break;
case '\v': *ptr++ = '\\'; *ptr++ = 'v'; break;
case '\f': *ptr++ = '\\'; *ptr++ = 'f'; break;
case '\\': *ptr++ = '\\'; *ptr++ = '\\'; break;
case '"' : *ptr++ = '\\'; *ptr++ = '"'; break;
default:
if (isprint(val) || val == ' ') {
*ptr++ = val;
}
else {
*ptr++ = '\\';
*ptr++ = '0';
*ptr++ = ((val&0700)>>6)+'0';
*ptr++ = ((val&070)>>3)+'0';
*ptr++ = (val&07)+'0';
}
break;
default:
if (isprint(val) || val == ' ')
{
*ptr++ = val;
}
else
{
*ptr++ = '\\';
*ptr++ = '0';
*ptr++ = ((val&0700)>>6)+'0';
*ptr++ = ((val&070)>>3)+'0';
*ptr++ = (val&07)+'0';
}
break;
}
}
*ptr++ = '"';
*ptr = '\0';
result = [[[_fastCls._NSGCString alloc] initWithCStringNoCopy: buf
length: length+2 fromZone: z] autorelease];
return result;
*ptr++ = '"';
*ptr = '\0';
result = [[_fastCls._NSGCString alloc] initWithCStringNoCopy: buf
length: length+2 fromZone: z];
[output appendString: result];
[result release];
}
else
{
[output appendString: self];
}
return self;
}
}
@end

View file

@ -303,17 +303,6 @@
}
}
- (Class) classForPortCoder
{
return [self class];
}
- replacementObjectForPortCoder:(NSPortCoder*)aCoder
{
return self;
}
// FOR IndexedCollection SUPPORT;
- objectAtIndex: (unsigned)index

View file

@ -33,6 +33,7 @@
#include <Foundation/NSAutoreleasePool.h>
#include <Foundation/NSString.h>
#include <gnustep/base/o_map.h>
#include <Foundation/NSArray.h>
#include <Foundation/NSException.h>
#include <Foundation/NSPortCoder.h>
#include <Foundation/NSDistantObject.h>
@ -515,12 +516,31 @@ static BOOL double_release_check_enabled = NO;
- (NSString*) description
{
return [NSString stringWithCString: object_get_class_name(self)];
return [NSString stringWithFormat: @"<%s %lx>",
object_get_class_name(self), (unsigned long)self];
}
+ (NSString*) description
{
return [NSString stringWithCString: class_get_class_name(self)];
return [NSString stringWithFormat: @"<%s>", object_get_class_name(self)];
}
- (void) descriptionTo: (id<GNUDescriptionDestination>)output
{
[output appendString: [self description]];
}
- (void) descriptionWithLocale: (NSDictionary*)aLocale
to: (id<GNUDescriptionDestination>)output
{
[output appendString: [(id)self descriptionWithLocale: aLocale]];
}
- (void) descriptionWithLocale: (NSDictionary*)aLocale
indent: (unsigned)level
to: (id<GNUDescriptionDestination>)output
{
[output appendString: [(id)self descriptionWithLocale: aLocale indent: level]];
}
+ (void) poseAsClass: (Class)aClassObject

View file

@ -35,43 +35,48 @@
+ (id) alloc
{
return [self allocWithZone: NSDefaultMallocZone()];
return [self allocWithZone: NSDefaultMallocZone()];
}
+ (id) allocWithZone: (NSZone*)z
{
NSProxy* ob = (NSProxy*) NSAllocateObject (self, 0, z);
return ob;
NSProxy* ob = (NSProxy*) NSAllocateObject(self, 0, z);
return ob;
}
+ autorelease
+ (id) autorelease
{
return self;
return self;
}
+ (Class) class
{
return self;
return self;
}
+ (void) load
{
/* Do nothing */
/* Do nothing */
}
+ (NSString*) description
{
return [NSString stringWithFormat: @"<%s>", object_get_class_name(self)];
}
+ (BOOL) respondsToSelector: (SEL)aSelector
{
return (class_get_class_method(self, aSelector) != METHOD_NULL);
return (class_get_class_method(self, aSelector) != METHOD_NULL);
}
+ (void) release
{
/* Do nothing */
/* Do nothing */
}
+ retain
+ (id) retain
{
return self;
return self;
}
+ (Class) superclass
@ -79,175 +84,185 @@
return class_get_super_class (self);
}
- autorelease
- (id) autorelease
{
[NSAutoreleasePool addObject:self];
return self;
[NSAutoreleasePool addObject:self];
return self;
}
- (Class) class
{
return object_get_class(self);
return object_get_class(self);
}
#if 0
- (BOOL) conformsToProtocol: (Protocol*)aProtocol
{
NSInvocation* inv;
NSMethodSignature* sig;
BOOL result;
NSInvocation *inv;
NSMethodSignature *sig;
BOOL result;
sig = [self methodSignatureForSelector:@selector(conformsToProtocol:)];
inv = [NSInvocation invocationWithMethodSignature:sig];
[inv setSelector:@selector(conformsToProtocol:)];
[inv setArgument:aProtocol atIndex:2];
[self forwardInvocation:inv];
[inv getReturnValue: &result];
return result;
sig = [self methodSignatureForSelector:@selector(conformsToProtocol:)];
inv = [NSInvocation invocationWithMethodSignature:sig];
[inv setSelector:@selector(conformsToProtocol:)];
[inv setArgument:aProtocol atIndex:2];
[self forwardInvocation:inv];
[inv getReturnValue: &result];
return result;
}
#endif
- (void) dealloc
{
NSDeallocateObject((NSObject*)self);
NSDeallocateObject((NSObject*)self);
}
- (NSString*) description
{
return [NSString stringWithCString: object_get_class_name(self)];
return [NSString stringWithFormat: @"<%s %lx>",
object_get_class_name(self), (unsigned long)self];
}
- (void) forwardInvocation: (NSInvocation*)anInvocation
{
[NSException raise: NSInvalidArgumentException
format: @"NSProxy should not implement '%s'",
[NSException raise: NSInvalidArgumentException
format: @"NSProxy should not implement '%s'",
sel_get_name(_cmd)];
}
- (unsigned int) hash
{
return (unsigned int)self;
return (unsigned int)self;
}
- init
- (id) init
{
return self;
return self;
}
- (BOOL) isEqual: anObject
- (BOOL) isEqual: (id)anObject
{
return (self == anObject);
return (self == anObject);
}
- (BOOL) isKindOfClass: (Class)aClass
{
Class class = self->isa;
Class class = self->isa;
while (class != nil) {
if (class == aClass) {
return YES;
while (class != nil)
{
if (class == aClass)
{
return YES;
}
class = class_get_super_class(class);
class = class_get_super_class(class);
}
return NO;
return NO;
}
- (BOOL) isMemberOfClass: (Class)aClass
{
return(self->isa == aClass);
return(self->isa == aClass);
}
- (BOOL) isProxy
{
return YES;
return YES;
}
- notImplemented: (SEL)aSel
- (id) notImplemented: (SEL)aSel
{
[NSException raise: NSGenericException
format: @"NSProxy notImplemented %s", sel_get_name(aSel)];
return self;
[NSException raise: NSGenericException
format: @"NSProxy notImplemented %s", sel_get_name(aSel)];
return self;
}
- (NSMethodSignature*) methodSignatureForSelector: (SEL)aSelector
{
[NSException raise: NSInvalidArgumentException format:
[NSException raise: NSInvalidArgumentException format:
@"NSProxy should not implement 'methodSignatureForSelector:'"];
return nil;
return nil;
}
- performSelector: (SEL)aSelector
- (id) performSelector: (SEL)aSelector
{
IMP msg = objc_msg_lookup(self, aSelector);
IMP msg = objc_msg_lookup(self, aSelector);
if (!msg) {
[NSException raise: NSGenericException
format: @"invalid selector passed to %s",
if (!msg)
{
[NSException raise: NSGenericException
format: @"invalid selector passed to %s",
sel_get_name(_cmd)];
return nil;
return nil;
}
return (*msg)(self, aSelector);
return (*msg)(self, aSelector);
}
- performSelector: (SEL)aSelector withObject: anObject
- (id) performSelector: (SEL)aSelector
withObject: (id)anObject
{
IMP msg = objc_msg_lookup(self, aSelector);
IMP msg = objc_msg_lookup(self, aSelector);
if (!msg) {
[NSException raise: NSGenericException
format: @"invalid selector passed to %s",
if (!msg)
{
[NSException raise: NSGenericException
format: @"invalid selector passed to %s",
sel_get_name(_cmd)];
return nil;
return nil;
}
return (*msg)(self, aSelector, anObject);
return (*msg)(self, aSelector, anObject);
}
- performSelector: (SEL)aSelector withObject: anObject withObject: anotherObject
- (id) performSelector: (SEL)aSelector
withObject: (id)anObject
withObject: (id)anotherObject
{
IMP msg = objc_msg_lookup(self, aSelector);
IMP msg = objc_msg_lookup(self, aSelector);
if (!msg) {
[NSException raise: NSGenericException
format: @"invalid selector passed to %s",
if (!msg)
{
[NSException raise: NSGenericException
format: @"invalid selector passed to %s",
sel_get_name(_cmd)];
return nil;
return nil;
}
return (*msg)(self, aSelector, anObject, anotherObject);
return (*msg)(self, aSelector, anObject, anotherObject);
}
- (void) release
{
if (_retain_count-- == 0) {
[self dealloc];
if (_retain_count-- == 0)
{
[self dealloc];
}
}
#if 0
- (BOOL) respondsToSelector: (SEL)aSelector
{
NSInvocation* inv;
NSMethodSignature* sig;
BOOL result;
NSInvocation* inv;
NSMethodSignature* sig;
BOOL result;
sig = [self methodSignatureForSelector:@selector(respondsToSelector:)];
inv = [NSInvocation invocationWithMethodSignature:sig];
[inv setSelector:@selector(respondsToSelector:)];
[inv setArgument:(void*)aSelector atIndex:2];
[self forwardInvocation:inv];
[inv getReturnValue: &result];
return result;
sig = [self methodSignatureForSelector:@selector(respondsToSelector:)];
inv = [NSInvocation invocationWithMethodSignature:sig];
[inv setSelector:@selector(respondsToSelector:)];
[inv setArgument:(void*)aSelector atIndex:2];
[self forwardInvocation:inv];
[inv getReturnValue: &result];
return result;
}
#endif
- retain
- (id) retain
{
_retain_count++;
return self;
_retain_count++;
return self;
}
- (unsigned int) retainCount
{
return _retain_count + 1;
return _retain_count + 1;
}
+ (unsigned) retainCount
@ -255,19 +270,19 @@
return UINT_MAX;
}
- self
- (id) self
{
return self;
return self;
}
- (Class) superclass
{
return object_get_super_class(self);
return object_get_super_class(self);
}
- (NSZone*)zone
- (NSZone*) zone
{
return NSZoneFromPointer(self);
return NSZoneFromPointer(self);
}
@end

View file

@ -50,6 +50,8 @@
#include <Foundation/NSDictionary.h>
#include <Foundation/NSUserDefaults.h>
#include <Foundation/NSFileManager.h>
#include <Foundation/NSPortCoder.h>
#include <Foundation/NSPathUtilities.h>
#include <gnustep/base/IndexedCollection.h>
#include <Foundation/NSData.h>
@ -2588,7 +2590,6 @@ else
return ret;
}
// #ifndef STRICT_OPENSTEP
+ (NSString*) pathWithComponents: (NSArray*)components
{
NSString *s = [components objectAtIndex: 0];
@ -2677,93 +2678,102 @@ else
d = [self dataUsingEncoding: NSUnicodeStringEncoding];
return [d writeToFile: filename atomically: useAuxiliaryFile];
}
// #endif
// #ifndef NO_GNUSTEP
- (NSString*) descriptionForPropertyList
- (void) descriptionTo: (NSMutableString*)output
{
static NSCharacterSet *quotables = nil;
static NSCharacterSet *quotables = nil;
if (quotables == nil) {
quotables = [[NSCharacterSet alphanumericCharacterSet] invertedSet];
[quotables retain];
if ([self length] == 0)
{
[output appendString: @"\"\""];
return;
}
if ([self length] == 0 ||
[self rangeOfCharacterFromSet: quotables].length > 0) {
const char *cstring = [self cString];
const char *from;
int len = 0;
if (quotables == nil)
{
quotables = [[NSCharacterSet alphanumericCharacterSet] invertedSet];
[quotables retain];
}
for (from = cstring; *from; from++) {
switch (*from) {
case '\a':
case '\b':
case '\t':
case '\r':
case '\n':
case '\v':
case '\f':
case '\\':
case '\'' :
case '"' :
len += 2;
break;
if ([self rangeOfCharacterFromSet: quotables].length > 0)
{
const char *cstring = [self cString];
const char *from;
int len = 0;
for (from = cstring; *from; from++)
{
switch (*from)
{
case '\a':
case '\b':
case '\t':
case '\r':
case '\n':
case '\v':
case '\f':
case '\\':
case '\'' :
case '"' :
len += 2;
break;
default:
if (isprint(*from) || *from == ' ')
{
len++;
}
else
{
len += 4;
}
break;
}
}
{
char buf[len+3];
char *ptr = buf;
*ptr++ = '"';
for (from = cstring; *from; from++)
{
switch (*from)
{
case '\a': *ptr++ = '\\'; *ptr++ = 'a'; break;
case '\b': *ptr++ = '\\'; *ptr++ = 'b'; break;
case '\t': *ptr++ = '\\'; *ptr++ = 't'; break;
case '\r': *ptr++ = '\\'; *ptr++ = 'r'; break;
case '\n': *ptr++ = '\\'; *ptr++ = 'n'; break;
case '\v': *ptr++ = '\\'; *ptr++ = 'v'; break;
case '\f': *ptr++ = '\\'; *ptr++ = 'f'; break;
case '\\': *ptr++ = '\\'; *ptr++ = '\\'; break;
case '\'': *ptr++ = '\\'; *ptr++ = '\''; break;
case '"' : *ptr++ = '\\'; *ptr++ = '"'; break;
default:
if (isprint(*from) || *from == ' ') {
len++;
if (isprint(*from) || *from == ' ')
{
*ptr++ = *from;
}
else {
len += 4;
else
{
sprintf(ptr, "\\%03o", *(unsigned char*)from);
ptr = &ptr[4];
}
break;
}
}
if (len == 0) {
return @"\"\"";
}
else {
char buf[len+3];
char *ptr = buf;
NSString *result;
*ptr++ = '"';
for (from = cstring; *from; from++) {
switch (*from) {
case '\a': *ptr++ = '\\'; *ptr++ = 'a'; break;
case '\b': *ptr++ = '\\'; *ptr++ = 'b'; break;
case '\t': *ptr++ = '\\'; *ptr++ = 't'; break;
case '\r': *ptr++ = '\\'; *ptr++ = 'r'; break;
case '\n': *ptr++ = '\\'; *ptr++ = 'n'; break;
case '\v': *ptr++ = '\\'; *ptr++ = 'v'; break;
case '\f': *ptr++ = '\\'; *ptr++ = 'f'; break;
case '\\': *ptr++ = '\\'; *ptr++ = '\\'; break;
case '\'': *ptr++ = '\\'; *ptr++ = '\''; break;
case '"' : *ptr++ = '\\'; *ptr++ = '"'; break;
default:
if (isprint(*from) || *from == ' ') {
*ptr++ = *from;
}
else {
sprintf(ptr, "\\%03o", *(unsigned char*)from);
ptr = &ptr[4];
}
break;
}
}
*ptr++ = '"';
*ptr = '\0';
result = [NSString stringWithCString: buf];
return result;
}
break;
}
}
*ptr++ = '"';
*ptr = '\0';
[output appendString: [NSString stringWithCString: buf]];
}
}
else
{
[output appendString: self];
}
return self;
}
// #endif /* NO_GNUSTEP */
/* NSCopying Protocol */
@ -2797,6 +2807,28 @@ else
return self;
}
- (Class) classForArchiver
{
return [self class];
}
- (Class) classForCoder
{
return [self class];
}
- (Class) classForPortCoder
{
return [self class];
}
- (id) replacementObjectForPortCoder: (NSPortCoder*)aCoder
{
if ([aCoder isByref] == NO)
return self;
return [super replacementObjectForPortCoder: aCoder];
}
@end