This is List_Archival.m in view mode; [Download] [Up]
#import "List_Archival.h" #import <appkit/appkit.h> #import <objc/objc-runtime.h> @implementation List(Archival) static inline char *ClassName() { return "List"; } static inline long ArchiveVersion() { long version; version = 1000 * LIST_VERS + 10 * LIST_SUBVERS + LIST_TYPE; return version; } - (const char *) name { return "List"; } - initFromTStream:(NXTypedStream *) stream { [self initCount: 0]; return [self readFromTStream: stream]; } - readFromTStream:(NXTypedStream *) stream { long version; int objCount; Class objClass; Object <ObjectArchival> *obj; const char *objsClassName, *className; void *data1 = NULL, *data2 = NULL; NX_DURING [self debug: SUPER_DEBUG method: _cmd, "class = %s; superclass = %s\n", [[self class] name], [[self superclass] name]]; [self debug: SUPER_DEBUG method: _cmd, "\tinstance = %s\n", ClassName()]; /* Read the object class name & version */ NXReadTypes(stream, "*i", &className, &version); if( strcmp(className, ClassName()) != 0 ) { NXAllocErrorData(strlen(className)+1, &data1); NXAllocErrorData(strlen(ClassName())+1, &data2); strcpy(data1, className); strcpy(data2, ClassName()); NX_RAISE(eWrongClassName, data1, data2); } /* Unarchive this version format */ switch( version ) { case LIST_VERSION_0: NXReadType(stream, "i", &objCount); if( objCount <= 0 ) { [self free]; return nil; } /* Determine the class of the archived objects */ NXReadType(stream, "*", &objsClassName); objClass = objc_lookUpClass(objsClassName); NXAllocErrorData(strlen(objsClassName)+1, &data1); strcpy(data1, objsClassName); if( objClass == nil ) NX_RAISE(eUnknownArchiveClass, data1, NULL); /* Make sure this class conforms to the ObjectArchival protocol */ if( [objClass conformsTo:@protocol(ObjectArchival)] == NO ) NX_RAISE(eNonconformingClass, data1, NULL); /* Read in the list's objects */ while( numElements < objCount ) { obj = [[objClass alloc] initFromTStream: stream]; if( obj == nil ) NX_RAISE(eObjReadErr, data1, NULL); [self addObject: obj]; } break; default: NXAllocErrorData(strlen([[self class] name])+1, &data1); NXAllocErrorData(sizeof(long), &data2); strcpy(data1, [[self class] name]); *((long *) data2) = version; NX_RAISE(eBadObjVersion, data1, data2); break; } NX_HANDLER NX_RERAISE(); NX_ENDHANDLER return self; } - writeToTStream:(NXTypedStream *) stream { long version; int element; id <ObjectArchival> obj; const char *objsClassName, *className; NX_DURING [self debug: SUPER_DEBUG method: _cmd, "class = %s; superclass = %s\n", [[self class] name], [[self superclass] name]]; [self debug: SUPER_DEBUG method: _cmd, "\tinstance = %s\n", ClassName()]; /* First write the class name & version */ className = ClassName(); version = ArchiveVersion(); NXWriteTypes(stream, "*i", &className, &version); NXWriteType(stream, "i", &numElements); /* Write the class name of the archived objects */ objsClassName = [[[self objectAt: 0] class] name]; NXWriteType(stream, "*", &objsClassName); /* Write out the list's objects */ element = 0; while( element < numElements ) { obj = [self objectAt: element ++]; [obj writeToTStream: stream]; } NX_HANDLER NX_RERAISE(); NX_ENDHANDLER return self; } @end /* RCS Information: $Author: me $; $Date: 93/02/23 02:00:43 $; $Source: /usr1/me/NeXTSrc/MyClasses/RCS/List_Archival.m,v $; $Revision: 1.1 $; $Log: List_Archival.m,v $ Revision 1.1 93/02/23 02:00:43 me Begin RCS logging. ; */
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.