From aea49bd3e24ada46bc90ace2d96d80dd342a963b Mon Sep 17 00:00:00 2001 From: mccallum Date: Mon, 3 Apr 1995 20:07:18 +0000 Subject: [PATCH] Apr 3 patch from Adam Fedor. See ChangeLog for details. git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@249 72102866-910b-0410-8b05-ffd578937521 --- Headers/gnustep/base/NSObject.h | 2 +- Headers/gnustep/base/NSValue.h | 17 +++- Makefile.in | 63 +++++++++++- Source/NSBundle.m | 164 +++++++++++++++----------------- Source/NSException.m | 10 +- Source/NSGeometry.m | 2 +- Source/NSValue.m | 155 ++++++++++++------------------ Source/String.m | 5 + 8 files changed, 226 insertions(+), 192 deletions(-) diff --git a/Headers/gnustep/base/NSObject.h b/Headers/gnustep/base/NSObject.h index 4bb7af268..65c101fa5 100644 --- a/Headers/gnustep/base/NSObject.h +++ b/Headers/gnustep/base/NSObject.h @@ -68,7 +68,7 @@ @end -@interface NSObject +@interface NSObject { Class isa; } diff --git a/Headers/gnustep/base/NSValue.h b/Headers/gnustep/base/NSValue.h index 6823423a3..f28a3c2b0 100644 --- a/Headers/gnustep/base/NSValue.h +++ b/Headers/gnustep/base/NSValue.h @@ -37,10 +37,6 @@ + (NSValue*) valueWithRect: (NSRect)rect; + (NSValue*) valueWithSize: (NSSize)size; -/* Note: not in OpenStep specification */ -- initValue: (const void*)value - withObjCType: (const char*)type; - // Accessing Data - (void) getValue: (void*)value; @@ -53,7 +49,7 @@ @end -@interface NSNumber : NSValue +@interface NSNumber : NSValue { } @@ -94,4 +90,15 @@ @end +/* Note: These methods are not in the OpenStep spec, but they may make + subclassing easier. */ +@interface NSValue (Subclassing) + +/* Used by value:withObjCType: to determine the concrete subclass to alloc */ ++ (Class)valueClassWithObjCType:(const char *)type; + +/* Designated initializer for all concrete subclasses */ +- initValue:(const void *)value withObjCType:(const char *)type; +@end + #endif /* __NSValue_h_OBJECTS_INCLUDE */ diff --git a/Makefile.in b/Makefile.in index f3b1351bc..626938b63 100644 --- a/Makefile.in +++ b/Makefile.in @@ -164,12 +164,29 @@ NSObject.m \ NSString.m FEDOR_GNUSTEP_MFILES = \ -NSBundle.m \ NSException.m \ NSGeometry.m \ NSNumber.m \ NSRange.m \ -NSValue.m +NSValue.m \ +NSConcreteValue.m +#NSArray.m \ +#NSCoder.m \ +#NSDictionary.m \ +#NSBundle.m \ + +#FEDOR_GNUSTEP_CFILES = \ +#objc-load.c \ +#find_exec.c + +FEDOR_CLUSTER_OBJS = $(NSVALUE_OFILES) $(NSNUMBER_OFILES) + +NSVALUE_CLUSTER = 0 1 2 3 4 +NSVALUE_OFILES = NSValue0.o NSValue1.o NSValue2.o NSValue3.o NSValue4.o +NSNUMBER_CLUSTER = 0 1 2 3 4 5 6 7 8 9 10 11 12 +NSNUMBER_OFILES = NSNumber0.o NSNumber1.o NSNumber2.o NSNumber3.o \ + NSNumber4.o NSNumber5.o NSNumber6.o NSNumber7.o NSNumber8.o \ + NSNumber9.o NSNumber10.o NSNumber11.o NSNumber12.o GNU_CFILES = \ behavior.c \ @@ -193,6 +210,7 @@ GNUSTEP_OTHER_SRCFILES = GNU_OBJS = $(GNU_MFILES:.m=.o) $(GNU_CFILES:.c=.o) NEXTSTEP_OBJS = $(NEXTSTEP_MFILES:.m=.o) $(NEXTSTEP_CFILES:.c=.o) GNUSTEP_OBJS = $(GNUSTEP_MFILES:.m=.o) $(GNUSTEP_CFILES:.c=.o) +FEDOR_GNUSTEP_OBJS = $(FEDOR_GNUSTEP_MFILES:.m=.o) $(FEDOR_GNUSTEP_CFILES:.c=.o) $(FEDOR_CLUSTER_OBJS) GNU_HEADERS = \ objects/Array.h \ @@ -295,10 +313,12 @@ FEDOR_GNUSTEP_HEADERS = \ foundation/NSBundle.h \ foundation/NSException.h \ foundation/NSGeometry.h \ -foundation/NSValue.h +foundation/NSValue.h \ +foundation/NSConcreteValue.h \ +foundation/NSConcreteNumber.h INSTALL_HEADERS = @INSTALL_HEADERS@ -INSTALL_OBJS = @INSTALL_OBJS@ +INSTALL_OBJS = @INSTALL_OBJS@ DIST_FILES = \ README readme.texi \ @@ -353,6 +373,40 @@ depend: rm -f $(srcdir)/Makefile.depend $(CC) $(ALL_INCLUDE_FLAGS) -M $(SRCS) > $(srcdir)/Makefile.depend +# Compilation of class clusters +$(NSVALUE_OFILES) : NSCTemplateValue.m + for i in ${NSVALUE_CLUSTER}; do \ + cp NSCTemplateValue.m NSCTemplateValue$$i.m; \ + $(CC) -c $(ALL_CPPFLAGS) $(DEFS) $(ALL_OBJCFLAGS) \ + -DTYPE_ORDER=$$i NSCTemplateValue$$i.m -o NSValue$$i.o; \ + rm -f NSCTemplateValue$$i.m; \ + done + +$(NSNUMBER_OFILES) : NSConcreteNumber.m + for i in ${NSNUMBER_CLUSTER}; do \ + cp NSConcreteNumber.m NSConcreteNumber$$i.m; \ + $(CC) -c $(ALL_CPPFLAGS) $(DEFS) $(ALL_OBJCFLAGS) \ + -DTYPE_ORDER=$$i -c NSConcreteNumber$$i.m -o NSNumber$$i.o; \ + rm -f NSConcreteNumber$$i.m; \ + done + +# Compilation of class clusters +$(NSVALUE_OFILES) : NSCTemplateValue.m + for i in ${NSVALUE_CLUSTER}; do \ + cp NSCTemplateValue.m NSCTemplateValue$$i.m; \ + $(CC) -c $(ALL_CPPFLAGS) $(DEFS) $(ALL_OBJCFLAGS) \ + -DTYPE_ORDER=$$i NSCTemplateValue$$i.m -o NSValue$$i.o; \ + rm -f NSCTemplateValue$$i.m; \ + done + +$(NSNUMBER_OFILES) : NSConcreteNumber.m + for i in ${NSNUMBER_CLUSTER}; do \ + cp NSConcreteNumber.m NSConcreteNumber$$i.m; \ + $(CC) -c $(ALL_CPPFLAGS) $(DEFS) $(ALL_OBJCFLAGS) \ + -DTYPE_ORDER=$$i -c NSConcreteNumber$$i.m -o NSNumber$$i.o; \ + rm -f NSConcreteNumber$$i.m; \ + done + NXStringTable_scan.c: NXStringTable_scan.l $(LEX) $(LFLAGS) -t NXStringTable_scan.l > NXStringTable_scan.temp sed 's/yy/NXlex_/g' < NXStringTable_scan.temp > NXStringTable_scan.c @@ -459,6 +513,7 @@ clean: mostlyclean distclean: clean rm -f Makefile config.status config.log config.cache + rm -f dynamic-load.h realclean: distclean rm -f TAGS configure \ diff --git a/Source/NSBundle.m b/Source/NSBundle.m index c24dd7937..9eb255555 100644 --- a/Source/NSBundle.m +++ b/Source/NSBundle.m @@ -1,32 +1,54 @@ /* Implementation of NSBundle class - * - * Copyright (C) 1993 The Board of Trustees of - * The Leland Stanford Junior University. All Rights Reserved. - * - * Authors: Adam Fedor, Scott Francis, Fred Harris, Paul Kunz, Tom Pavel, - * Imran Qureshi, and Libing Wang - * - * This file is part of an Objective-C class library - * - * NSBundle.m,v 1.8 1993/10/20 00:44:53 pfkeb Exp - */ + Copyright (C) 1993,1994,1995 Free Software Foundation, Inc. + + Written by: Adam Fedor + Date: May 1993 + + This file is part of the GNU Objective C Class Library. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ -#include #include #include -#include +#include /* Needed by sys/stat */ #include #include -#include +#include +#include #include #include #include #include -#ifndef index -#define index strchr +/* Deal with strchr: */ +#if STDC_HEADERS || HAVE_STRING_H +#include +/* An ANSI string.h and pre-ANSI memory.h might conflict. */ +#if !STDC_HEADERS && HAVE_MEMORY_H +#include +#endif /* not STDC_HEADERS and HAVE_MEMORY_H */ #define rindex strrchr -#endif +#define bcopy(s, d, n) memcpy ((d), (s), (n)) +#define bcmp(s1, s2, n) memcmp ((s1), (s2), (n)) +#define bzero(s, n) memset ((s), 0, (n)) +#else /* not STDC_HEADERS and not HAVE_STRING_H */ +#include +/* memory.h and strings.h conflict on some systems. */ +#endif /* not STDC_HEADERS and not HAVE_STRING_H */ #ifndef FREE_OBJECT #define FFREE_OBJECT(id) ([id release],id=nil) @@ -37,9 +59,10 @@ #define BUNDLE_EXT "bundle" /* By default, we transmorgrify extensions of type "nib" to type "xmib" - which is the common extension for IB files for the GnuStep project + which is the common extension for IB files for the GNUStep project */ -#define IB_EXT "xmib" +static NSString *bundle_nib_ext = @"nib"; +static NSString *bundle_xmib_ext = @"xmib"; /* Class variables - We keep track of all the bundles and all the classes that are in each bundle @@ -52,10 +75,10 @@ static NSMutableArray *_bundleClasses = nil; static NSArray *_languages = nil; /* When we are linking in an object file, objc_load_modules calls our - callBack routine for every Class and Category loaded. The following + callback routine for every Class and Category loaded. The following variable stores the bundle that is currently doing the loading so we know - where to store the class names. This is way non-thread-safe, but - apparently this is how NeXT does it (maybe?). + where to store the class names. + FIXME: This should be put into a NSThread dictionary */ static int _loadingBundlePos = -1; @@ -63,7 +86,7 @@ static BOOL _stripAfterLoading; /* Get the object file that should be located in the bundle of the same name */ static NSString * -object_name(NSString *path) +bundle_object_name(NSString *path) { NSString *name; name = [[path lastPathComponent] stringByDeletingPathExtension]; @@ -74,37 +97,30 @@ object_name(NSString *path) /* Construct a path from the directory, language, name and extension. Used by pathForResource:... */ -static NSString *nib; -static NSString *xmib; - static NSString * -construct_path(NSString *path, NSString *lang, - NSString *name, NSString *ext ) +bundle_resource_path(NSString *path, NSString *lang, NSString *name, + NSString *ext ) { NSString *fullpath; + NSString *name_ext; + name_ext = [name pathExtension]; name = [name stringByDeletingPathExtension]; - if ([ext compare:nib] == NSOrderedSame) - ext = xmib; -// FIXME: change when NSString can support %@ parameters + // FIXME: we could check to see if name_ext and ext match, but what + // would we do if they didn't? + if (!ext) + ext = name_ext; + if ([ext compare:bundle_nib_ext] == NSOrderedSame) + ext = bundle_xmib_ext; if (lang) { fullpath = [NSString stringWithFormat: - TEMP_STRING("%s/%s.lproj/%s.%s"), [path cString], - [lang cString], [name cString], [ext cString]]; + @"%@/%@.lproj/%@", path, lang, name]; } else { - fullpath = [NSString stringWithFormat: - TEMP_STRING("%s/%s.%s"), [path cString], - [name cString], [ext cString]]; + fullpath = [NSString stringWithFormat: @"%@/%@", path, name]; } -/* - if (lang) { - fullpath = [NSString stringWithFormat: - TEMP_STRING("%@/%@.lproj/%@.%@"), path, lang, name, ext]; - } else { - fullpath = [NSString stringWithFormat: - TEMP_STRING("%@/%@.%@"), path, name, ext]; - } -*/ + if (ext && [ext length] != 0) + fullpath = [NSString stringByAppendingPathExtension:ext]; + #ifdef DEBUG fprintf(stderr, "Debug (NSBundle): path is %s\n", [fullpath cString]); #endif @@ -124,24 +140,17 @@ _bundle_load_callback(Class *theClass, Category *theCategory) @implementation NSBundle -+ (void)initialize -{ - nib = STATIC_STRING("nib"); - xmib = STATIC_STRING("xmib"); -} - + (NSBundle *)mainBundle { if ( !_mainBundle ) { NSString *path; path = [NSString stringWithCString:objc_executable_location()]; + assert(path); + assert([path length]); + /* Strip off the name of the program */ path = [path stringByDeletingLastPathComponent]; - if (!path || [path length] == 0) { - fprintf(stderr, "Error (NSBundle): Cannot find main bundle.\n"); - return nil; - } #ifdef DEBUG fprintf(stderr, "Debug (NSBundle): Found main in %s\n", @@ -165,6 +174,7 @@ _bundle_load_callback(Class *theClass, Category *theCategory) int i, count; NSBundle *bundle = nil; + // FIXME: should this be an error if aClass == nil? if (!aClass) return nil; @@ -205,13 +215,13 @@ _bundle_load_callback(Class *theClass, Category *theCategory) if (!path || [path length] == 0) { [NSException raise:NSInvalidArgumentException - format:TEMP_STRING("No path specified for bundle")]; + format:@"No path specified for bundle"]; /* NOT REACHED */ } if (stat([path cString], &statbuf) != 0) { [NSException raise:NSGenericException - format:TEMP_STRING("Path does not exist")]; + format:@"Could not find path %s", [path cString]]; /* NOT REACHED */ } _path = [path retain]; @@ -254,11 +264,11 @@ _bundle_load_callback(Class *theClass, Category *theCategory) { int j, class_count; NSArray *classList; - Class *theClass = Nil; + Class theClass = Nil; if (!_codeLoaded) { if (self != _mainBundle && ![self principalClass]) { [NSException raise:NSGenericException - format:TEMP_STRING("Unable to get classes")]; + format:@"No classes in bundle"]; /* NOT REACHED */ } } @@ -292,13 +302,13 @@ _bundle_load_callback(Class *theClass, Category *theCategory) } if (!_codeLoaded) { - NSString *object = object_name(_path); + NSString *object = bundle_object_name(_path); /* Link in the object file */ _loadingBundlePos = [_bundles indexOfObject:self]; if (objc_load_module([object cString], stderr, _bundle_load_callback, NULL, NULL)) { [NSException raise:NSGenericException - format:TEMP_STRING("Unable to load module")]; + format:@"Unable to load module %s", [object cString]]; /* NOT REACHED */ } else _codeLoaded = YES; @@ -331,7 +341,7 @@ _bundle_load_callback(Class *theClass, Category *theCategory) if (!name || [name length] == 0) { [NSException raise:NSInvalidArgumentException - format:TEMP_STRING("No resource name specified.")]; + format:@"No resource name specified."]; /* NOT REACHED */ } @@ -339,15 +349,14 @@ _bundle_load_callback(Class *theClass, Category *theCategory) unsigned i, count; count = [_languages count]; for (i=0; i < count; i++) { - path = construct_path(bundlePath, [_languages objectAtIndex:i], - name, ext ); + path = bundle_resource_path(bundlePath, + [_languages objectAtIndex:i], name, ext ); if ( stat([path cString], &statbuf) == 0) break; path = nil; - count++; } } else { - path = construct_path(bundlePath, TEMP_STRING("English"), name, ext ); + path = bundle_resource_path(bundlePath, @"English", name, ext ); if ( stat([path cString], &statbuf) != 0) { path = nil; } @@ -355,13 +364,12 @@ _bundle_load_callback(Class *theClass, Category *theCategory) } if (!path) { - path = construct_path(bundlePath, nil, name, ext ); + path = bundle_resource_path(bundlePath, nil, name, ext ); if ( stat([path cString], &statbuf) != 0) { path = nil; } } - /* Note: path is already autoreleased */ return path; } @@ -390,8 +398,8 @@ _bundle_load_callback(Class *theClass, Category *theCategory) + (void)setSystemLanguages:(NSArray *)languages { - static NSString *separator; - if (!separator) separator = STATIC_STRING(" "); + static NSString *separator = @" "; + if (_languages) { FREE_OBJECT(_languages); } @@ -401,7 +409,7 @@ _bundle_load_callback(Class *theClass, Category *theCategory) string. */ if (!languages) { - NSString *env = [NSString stringWithCString:getenv("LANGUAGE")]; + NSString *env = [NSString stringWithCString:getenv("LANGUAGES")]; if (env && [env length] != 0) _languages = [[env componentsSeparatedByString:separator] retain]; } else @@ -409,18 +417,4 @@ _bundle_load_callback(Class *theClass, Category *theCategory) } -// FIXME: this is here to please IndexedCollection - NSObject doesn't have it -- (int)compare:anotherObject -{ - if ([self isEqual:anotherObject]) - return 0; - // Ordering objects by their address is pretty useless, - // so subclasses should override this is some useful way. - else if (self > anotherObject) - return 1; - else - return -1; - -} - @end diff --git a/Source/NSException.m b/Source/NSException.m index c5019e9dd..228339c32 100644 --- a/Source/NSException.m +++ b/Source/NSException.m @@ -81,8 +81,10 @@ _NSFoundationUncaughtExceptionHandler(NSException *exception) NSString *reason; NSException *except; - reason = [[NSString alloc] initWithFormat:format arguments:argList]; - [reason autorelease]; + // OK?: not in OpenStep docs but is implmented by GNUStep + reason = [NSString stringWithFormat:format arguments:argList]; + //reason = [[NSString alloc] initWithFormat:format arguments:argList]; + //[reason autorelease]; except = [self exceptionWithName:name reason:reason userInfo:nil]; [except raise]; } @@ -137,7 +139,7 @@ _NSFoundationUncaughtExceptionHandler(NSException *exception) - (void)encodeWithCoder:(NSCoder *)aCoder { - [super encodeWithCoder:aCoder]; +//FIXME [super encodeWithCoder:aCoder]; [aCoder encodeObject:e_name]; [aCoder encodeObject:e_reason]; [aCoder encodeObject:e_info]; @@ -145,7 +147,7 @@ _NSFoundationUncaughtExceptionHandler(NSException *exception) - (id)initWithCoder:(NSCoder *)aDecoder { - self = [super initWithCoder:aDecoder]; +//FIXME self = [super initWithCoder:aDecoder]; e_name = [[aDecoder decodeObject] retain]; e_reason = [[aDecoder decodeObject] retain]; e_info = [[aDecoder decodeObject] retain]; diff --git a/Source/NSGeometry.m b/Source/NSGeometry.m index bb0488dd4..df0175a3f 100644 --- a/Source/NSGeometry.m +++ b/Source/NSGeometry.m @@ -23,7 +23,7 @@ #include #include -#include "NSGeometry.h" +#include /* Create Basic Structures */ NSPoint diff --git a/Source/NSValue.m b/Source/NSValue.m index c7b0af96e..3bb62ec16 100644 --- a/Source/NSValue.m +++ b/Source/NSValue.m @@ -21,39 +21,15 @@ Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* - FIXME - Some of NeXT's requirements escape me at this point. Why would - you need to override classForCoder in subclasses? Can we encode void * - or not? -*/ - -/* xxx This needs fixing because NSValue shouldn't have any - instance variables. -mccallum */ - -#include "NSValue.h" -#include "NSObjectPrivate.h" /* For standard exceptions */ -#include "NSString.h" -#include "NSCoder.h" -#include "object_zone.h" /* Zone mallocing */ - -#include -#include +#include +#include @implementation NSValue // NSCopying +/* deepening is done by concrete subclasses */ - deepen { - void *old_ptr; - unsigned size; - - size = objc_sizeof_type([objctype cString]); - old_ptr = _dataptr; - _dataptr = (void *)NSZoneMalloc([self zone], size); - NS_CHECK_MALLOC(_dataptr) - memcpy(_dataptr, old_ptr, size); - - objctype = [objctype copyWithZone:[self zone]]; return self; } @@ -65,137 +41,132 @@ return [[super copyWithZone:zone] deepen]; } -// Allocating and Initializing - -/* This method is apperently not in the OpenStep specification, but it makes - subclassing a lot easier */ -- initValue:(const void *)value - withObjCType:(const char *)type +/* Returns the concrete class associated with the type encoding */ ++ (Class)valueClassWithObjCType:(const char *)type { - unsigned size; + Class theClass = [NSConcreteValue class]; + + /* Let someone else deal with this error */ + if (!type) + return theClass; + + if (strcmp(@encode(id), type) == 0) + theClass = [NSNonretainedObjectValue class]; + else if (strcmp(@encode(NSPoint), type) == 0) + theClass = [NSPointValue class]; + else if (strcmp(@encode(void *), type) == 0) + theClass = [NSPointerValue class]; + else if (strcmp(@encode(NSRect), type) == 0) + theClass = [NSRectValue class]; + else if (strcmp(@encode(NSSize), type) == 0) + theClass = [NSSizeValue class]; - if (!value || !type) { - [NSException raise:NSInvalidArgumentException - format:TEMP_STRING("NULL value or NULL type")]; - /* NOT REACHED */ - } - - // FIXME: objc_sizeof_type will abort when it finds an invalid type, when - // we really want to just raise an exception - size = objc_sizeof_type(type); - if (size <= 0) { - [NSException raise:NSInternalInconsistencyException - format:TEMP_STRING("Invalid Objective-C type")]; - /* NOT REACHED */ - } - - _dataptr = (void *)NSZoneMalloc([self zone], size); - NS_CHECK_MALLOC(_dataptr) - memcpy(_dataptr, value, size); - - objctype = [[NSString stringWithCString:type] retain]; - return self; + return theClass; } +// Allocating and Initializing + + (NSValue *)value:(const void *)value withObjCType:(const char *)type { - return [[[self alloc] initValue:value withObjCType:type] autorelease]; + Class theClass = [self valueClassWithObjCType:type]; + return [[[theClass alloc] initValue:value withObjCType:type] + autorelease]; } + (NSValue *)valueWithNonretainedObject: (id)anObject { - return [self value:&anObject withObjCType:@encode(id)]; + return [[[NSNonretainedObjectValue alloc] + initValue:&anObject withObjCType:@encode(id)] + autorelease]; } + (NSValue *)valueWithPoint:(NSPoint)point { - return [self value:&point withObjCType:@encode(NSPoint)]; + return [[[NSPointValue alloc] + initValue:&point withObjCType:@encode(NSPoint)] + autorelease]; } + (NSValue *)valueWithPointer:(const void *)pointer { - return [self value:&pointer withObjCType:@encode(void *)]; + return [[[NSPointerValue alloc] + initValue:&pointer withObjCType:@encode(void*)] + autorelease]; } + (NSValue *)valueWithRect:(NSRect)rect { - return [self value:&rect withObjCType:@encode(NSRect)]; + return [[[NSRectValue alloc] initValue:&rect withObjCType:@encode(NSRect)] + autorelease]; } + (NSValue *)valueWithSize:(NSSize)size { - return [self value:&size withObjCType:@encode(NSSize)]; -} - -- (void)dealloc -{ - [objctype release]; - NSZoneFree([self zone], _dataptr); - [super dealloc]; + return [[[NSSizeValue alloc] initValue:&size withObjCType:@encode(NSSize)] + autorelease]; } // Accessing Data +/* All the rest of these methods must be implemented by a subclass */ - (void)getValue:(void *)value { - if (!value) { - [NSException raise:NSInvalidArgumentException - format:TEMP_STRING("Cannot copy value into NULL buffer")]; - /* NOT REACHED */ - } - memcpy( value, _dataptr, objc_sizeof_type([objctype cString]) ); + [self doesNotRecognizeSelector:_cmd]; } - (const char *)objCType { - return [objctype cString]; + [self doesNotRecognizeSelector:_cmd]; + return 0; } -// FIXME: need to check to make sure these hold the right values... +// FIXME: Is this an error or an exception??? - (id)nonretainedObjectValue { - return *((id *)_dataptr); + [self doesNotRecognizeSelector:_cmd]; + return 0; } - (void *)pointerValue { - return *((void **)_dataptr); + [self doesNotRecognizeSelector:_cmd]; + return 0; } - (NSRect)rectValue { - return *((NSRect *)_dataptr); + [self doesNotRecognizeSelector:_cmd]; + return NSMakeRect(0,0,0,0); } - (NSSize)sizeValue { - return *((NSSize *)_dataptr); + [self doesNotRecognizeSelector:_cmd]; + return NSMakeSize(0,0); } - (NSPoint)pointValue { - return *((NSPoint *)_dataptr); + [self doesNotRecognizeSelector:_cmd]; + return NSMakePoint(0,0); +} + +// NSCoding (done by subclasses) +- classForCoder +{ + return [self class]; } -// NSCoding - (void)encodeWithCoder:(NSCoder *)coder { - - [super encodeWithCoder:coder]; - // FIXME: Do we need to check for encoding void, void * or will - // NSCoder do this for us? - [coder encodeObject:objctype]; - [coder encodeValueOfObjCType:[objctype cString] at:&_dataptr]; +//FIXME [super encodeWithCoder:coder]; } - (id)initWithCoder:(NSCoder *)coder { - self = [super initWithCoder:coder]; - objctype = [[coder decodeObject] retain]; - [coder decodeValueOfObjCType:[objctype cString] at:&_dataptr]; +//FIXME self = [super initWithCoder:coder]; return self; } - @end diff --git a/Source/String.m b/Source/String.m index 4e1b97f31..7d70cd4ce 100644 --- a/Source/String.m +++ b/Source/String.m @@ -273,6 +273,11 @@ return @encode(char); } +- (const char *) contentType +{ + return @encode(char); +} + - (int(*)(elt,elt)) comparisonFunction { return elt_compare_chars;