This is GSCoder.m in view mode; [Download] [Up]
/* Implementation for GSCoder
*
* Copyright (C) 1993 The Board of Trustees of
* The Leland Stanford Junior University. All Rights Reserved.
*
* Authors: Pau Kunz
*
* This file is part of an Objective-C library
*
* GSCoder.m,v 1.9 1995/07/03 18:15:17 pfkeb Exp
*/
/* Based on
* (Preliminary Documentation) Copyright (c) 1994 by NeXT Computer, Inc.
* All Rights Reserved.
*
* An implementation of NSCoder that uses GNU TypedStream
*
*/
#include "GSCoder.h"
#include <Foundation/NSString.h>
#include <appkit/graphics.h>
#ifdef __NeXT__
#include <objc/objc-runtime.h>
#include <gnuarchive/encoding.h>
#include <gnuarchive/objc/typedstream.h>
#else
#include <objc/encoding.h>
#include <objc/typedstream.h>
#endif
#include <streams/streams.h>
#include <stdarg.h> /* for ANSI programs */
#include <stdlib.h>
#define CODER_MAX_VAR_ARGS 10
@implementation GSCoder
// Encoding Data
- (void)encodeArrayOfObjCType:(const char *)types
count:(unsigned)count
at:(const void *)array
{
objc_write_array( stream, types, count, array);
return;
}
- (void)encodeBycopyObject:(id)anObject;
{
[self encodeObject:anObject];
return;
}
- (void)encodeConditionalObject:(id)anObject;
{
[self encodeObject:anObject];
return;
}
// - (void)encodeDataObject:(NSData *)data;
- (void)encodeObject:(id)anObject
{
objc_write_object( stream, anObject);
return;
}
- (void)encodeObjectReference:(id)anObject
{
objc_write_object_reference( stream, anObject);
return;
}
// - (void)encodePropertyList:(id)plist;
// - (void)encodePoint:(NSPoint)point;
- (void)encodeRect:(NXRect)rect
{
int box[4];
box[0] = rect.origin.x;
box[1] = rect.origin.y;
box[2] = rect.size.width;
box[3] = rect.size.height;
[self encodeArrayOfObjCType:"i" count:4 at:box];
return;
}
- (void)encodeRootObject:(id)rootObject
{
objc_write_root_object( stream, rootObject);
return;
}
- (void)encodeSize:(NXSize)size
{
int rect[2];
rect[0] = size.width;
rect[1] = size.height;
[self encodeArrayOfObjCType:"i" count:2 at:rect];
return;
}
- (void)encodeColor:(NXColor *)aColor
{
char *nullstring = "";
[self encodeArrayOfObjCType:"S" count:6 at:&aColor->colorField];
if ( aColor->str ) {
[self encodeValueOfObjCType:"*" at:&aColor->str];
} else {
[self encodeValueOfObjCType:"*" at:&nullstring];
}
return;
}
- (void)encodeValueOfObjCType:(const char *)type
at:(const void *)address
{
objc_write_type( stream, type, address );
return;
}
- (void)encodeValuesOfObjCTypes:(const char *)types, ...
{
va_list args;
const char *c;
char *where[CODER_MAX_VAR_ARGS];
int i;
va_start(args, types);
for ( c = types, i = 0; *c; c = objc_skip_typespec(c) ) {
if ( i < CODER_MAX_VAR_ARGS ) {
where[i++] = va_arg(args, char*);
} else {
printf( "[NXCoder decodeValuesOfObjCTypes]:"
" Maximum number of args exceeded\n");
return;
}
}
va_end(args);
objc_write_types(stream, types, where[0], where[1], where[2], where[3],
where[4], where[5], where[6], where[7], where[8], where[9]);
return;
}
// Decoding Data
- (void)decodeArrayOfObjCType:(const char *)types
count:(unsigned)count
at:(void *)address
{
objc_read_array( stream, types, count, address );
return;
}
// - (NSData *)decodeDataObject;
- (id)decodeObject
{
id object;
objc_read_object( stream, &object );
return object;
}
// - (id)decodePropertyList;
// - (NSPoint)decodePoint;
- (NXRect)decodeRect
{
NXRect rect;
int box[4];
[self decodeArrayOfObjCType:"i" count:4 at:box];
rect.origin.x = box[0];
rect.origin.y = box[1];
rect.size.width = box[2];
rect.size.height = box[3];
return rect;
}
- (NXSize)decodeSize
{
NXSize size;
int rect[2];
[self decodeArrayOfObjCType:"i" count:2 at:rect];
size.width = rect[0];
size.height = rect[1];
return size;
}
- (NXColor) decodeColor
{
NXColor color;
[self decodeArrayOfObjCType:"S" count:6 at:&color.colorField];
[self decodeValueOfObjCType:"*" at:&color.str];
if ( !strcmp( color.str, "" ) ) {
free((char *)color.str);
color.str = NULL;
}
return color;
}
- (void)decodeValueOfObjCType:(const char *)type
at:(void *)address
/*
* Deserializes data of Objective C type type residing at address address.
* You are responsible for releasing the resulting objects.
*/
{
objc_read_type( stream, type, address );
return;
}
- (void)decodeValuesOfObjCTypes:(const char *)types, ...
{
va_list args;
const char *c;
char *where[CODER_MAX_VAR_ARGS];
int i;
va_start(args, types);
for ( c = types, i = 0; *c; c = objc_skip_typespec(c) ) {
if ( i < CODER_MAX_VAR_ARGS ) {
where[i++] = va_arg(args, char*);
} else {
printf( "[NXCoder decodeValuesOfObjCTypes]:"
" Maximum number of args exceeded\n");
return;
}
}
va_end(args);
objc_read_types(stream, types, where[0], where[1], where[2], where[3],
where[4], where[5], where[6], where[7], where[8], where[9]);
return;
}
// Managing Zones
// - (NSZone *)objectZone;
// - (void)setObjectZone:(NSZone *)zone;
// Getting a Version
// - (unsigned int)systemVersion;
- (unsigned int)versionForClassName:(NSString *)className
{
const char *name = [className cString];
id aClass;
#ifdef __NeXT__
aClass = objc_lookUpClass(name);
#else
aClass = objc_lookup_class(name);
#endif
return objc_get_stream_class_version( stream, aClass );
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.