mirror of
https://github.com/gnustep/libs-base.git
synced 2025-04-25 01:31:08 +00:00
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
This commit is contained in:
parent
f81aa9757d
commit
aea49bd3e2
8 changed files with 226 additions and 192 deletions
|
@ -68,7 +68,7 @@
|
|||
@end
|
||||
|
||||
|
||||
@interface NSObject <NSObject, NSCoding>
|
||||
@interface NSObject <NSObject, NSCoding, NSCopying>
|
||||
{
|
||||
Class isa;
|
||||
}
|
||||
|
|
|
@ -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 <NSCoding>
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -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 */
|
||||
|
|
63
Makefile.in
63
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 \
|
||||
|
|
|
@ -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 <fedor@boulder.colorado.edu>
|
||||
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 <stdio.h>
|
||||
#include <assert.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/param.h> /* Needed by sys/stat */
|
||||
#include <sys/stat.h>
|
||||
#include <objc/objc-api.h>
|
||||
#include <objects/objc-load.h>
|
||||
#include <objects/stdobjects.h>
|
||||
#include <foundation/objc-load.h>
|
||||
#include <foundation/NSBundle.h>
|
||||
#include <foundation/NSException.h>
|
||||
#include <foundation/NSString.h>
|
||||
#include <foundation/NSArray.h>
|
||||
|
||||
#ifndef index
|
||||
#define index strchr
|
||||
/* Deal with strchr: */
|
||||
#if STDC_HEADERS || HAVE_STRING_H
|
||||
#include <string.h>
|
||||
/* An ANSI string.h and pre-ANSI memory.h might conflict. */
|
||||
#if !STDC_HEADERS && HAVE_MEMORY_H
|
||||
#include <memory.h>
|
||||
#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 <strings.h>
|
||||
/* 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
|
||||
|
|
|
@ -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];
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
|
||||
#include <math.h>
|
||||
#include <objects/stdobjects.h>
|
||||
#include "NSGeometry.h"
|
||||
#include <foundation/NSGeometry.h>
|
||||
|
||||
/* Create Basic Structures */
|
||||
NSPoint
|
||||
|
|
155
Source/NSValue.m
155
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 <objects/stdobjects.h>
|
||||
#include <string.h>
|
||||
#include <foundation/NSConcreteValue.h>
|
||||
#include <foundation/NSCoder.h>
|
||||
|
||||
@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
|
||||
|
||||
|
|
|
@ -273,6 +273,11 @@
|
|||
return @encode(char);
|
||||
}
|
||||
|
||||
- (const char *) contentType
|
||||
{
|
||||
return @encode(char);
|
||||
}
|
||||
|
||||
- (int(*)(elt,elt)) comparisonFunction
|
||||
{
|
||||
return elt_compare_chars;
|
||||
|
|
Loading…
Reference in a new issue