mirror of
https://github.com/gnustep/libs-base.git
synced 2025-05-30 08:21:25 +00:00
New file.
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@799 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
parent
5204209c5c
commit
b50c6a26a6
11 changed files with 1313 additions and 0 deletions
35
Headers/gnustep/base/BinaryCStream.h
Normal file
35
Headers/gnustep/base/BinaryCStream.h
Normal file
|
@ -0,0 +1,35 @@
|
|||
/* Interface for GNU Objective-C binary stream object for use serializing
|
||||
Copyright (C) 1996 Free Software Foundation, Inc.
|
||||
|
||||
Written by: R. Andrew McCallum <mccallum@gnu.ai.mit.edu>
|
||||
Written: Jan 1996
|
||||
|
||||
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.
|
||||
*/
|
||||
|
||||
#ifndef __BinaryCStream_h_OBJECTS_INCLUDE
|
||||
#define __BinaryCStream_h_OBJECTS_INCLUDE
|
||||
|
||||
#include <objects/stdobjects.h>
|
||||
#include <objects/Stream.h>
|
||||
#include <objects/CStream.h>
|
||||
|
||||
@interface BinaryCStream : CStream
|
||||
|
||||
@end
|
||||
|
||||
#endif /* __BinaryCStream_h_OBJECTS_INCLUDE */
|
55
Headers/gnustep/base/CStream.h
Normal file
55
Headers/gnustep/base/CStream.h
Normal file
|
@ -0,0 +1,55 @@
|
|||
/* Interface for GNU Objective-C stream object for use in archiving
|
||||
Copyright (C) 1996 Free Software Foundation, Inc.
|
||||
|
||||
Written by: R. Andrew McCallum <mccallum@gnu.ai.mit.edu>
|
||||
Written: Jan 1996
|
||||
|
||||
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.
|
||||
*/
|
||||
|
||||
#ifndef __CStream_h_OBJECTS_INCLUDE
|
||||
#define __CStream_h_OBJECTS_INCLUDE
|
||||
|
||||
#include <objects/stdobjects.h>
|
||||
#include <objects/Stream.h>
|
||||
#include <objects/CStreaming.h>
|
||||
|
||||
@interface CStream : Stream <CStreaming>
|
||||
{
|
||||
Stream *stream;
|
||||
int format_version;
|
||||
int indentation;
|
||||
}
|
||||
|
||||
/* These are standard ways to create a new CStream from a Stream
|
||||
that is open for reading.
|
||||
It reads the CStream signature at the beginning of the file, and
|
||||
automatically creates the appropriate subclass of CStream with
|
||||
the correct format version. */
|
||||
+ cStreamReadingFromFile: (id <String>) filename;
|
||||
+ cStreamReadingFromStream: (id <Streaming>) stream;
|
||||
|
||||
/* These are standard ways to create a new CStream with a Stream
|
||||
that is open for writing. */
|
||||
- initForWritingToFile: (id <String>) filename;
|
||||
- initForWritingToStream: (id <Streaming>) stream;
|
||||
+ cStreamWritingToStream: (id <Streaming>) stream;
|
||||
+ cStreamWritingToFile: (id <String>) filename;
|
||||
|
||||
@end
|
||||
|
||||
#endif /* __CStream_h_OBJECTS_INCLUDE */
|
56
Headers/gnustep/base/CStreaming.h
Normal file
56
Headers/gnustep/base/CStreaming.h
Normal file
|
@ -0,0 +1,56 @@
|
|||
/* Protocol for GNU Objective C byte streams that can code C types and indentn
|
||||
Copyright (C) 1995, 1996 Free Software Foundation, Inc.
|
||||
|
||||
Written by: R. Andrew McCallum <mccallum@gnu.ai.mit.edu>
|
||||
Date: April 1995
|
||||
|
||||
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.
|
||||
*/
|
||||
|
||||
#ifndef __CStreaming_h__OBJECTS_INCLUDE
|
||||
#define __CStreaming_h__OBJECTS_INCLUDE
|
||||
|
||||
#include <objects/stdobjects.h>
|
||||
#include <objects/Streaming.h>
|
||||
|
||||
@protocol CStreaming <Streaming>
|
||||
|
||||
- (void) encodeValueOfCType: (const char*) type
|
||||
at: (const void*) d
|
||||
withName: (id <String>) name;
|
||||
|
||||
- (void) decodeValueOfCType: (const char*) type
|
||||
at: (void*) d
|
||||
withName: (id <String> *) namePtr;
|
||||
|
||||
- (void) encodeName: (id <String>) name;
|
||||
- (void) decodeName: (id <String> *) name;
|
||||
|
||||
- (void) encodeIndent;
|
||||
- (void) decodeIndent;
|
||||
|
||||
- (void) encodeUnindent;
|
||||
- (void) decodeUnindent;
|
||||
|
||||
- (id <Streaming>) stream;
|
||||
|
||||
+ (int) defaultFormatVersion;
|
||||
|
||||
@end
|
||||
|
||||
#endif /* __CStreaming_h__OBJECTS_INCLUDE */
|
||||
|
35
Headers/gnustep/base/TextCStream.h
Normal file
35
Headers/gnustep/base/TextCStream.h
Normal file
|
@ -0,0 +1,35 @@
|
|||
/* Interface for GNU Objective-C text stream object for use serializing
|
||||
Copyright (C) 1996 Free Software Foundation, Inc.
|
||||
|
||||
Written by: R. Andrew McCallum <mccallum@gnu.ai.mit.edu>
|
||||
Written: Jan 1996
|
||||
|
||||
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.
|
||||
*/
|
||||
|
||||
#ifndef __TextCStream_h_OBJECTS_INCLUDE
|
||||
#define __TextCStream_h_OBJECTS_INCLUDE
|
||||
|
||||
#include <objects/stdobjects.h>
|
||||
#include <objects/Stream.h>
|
||||
#include <objects/CStream.h>
|
||||
|
||||
@interface TextCStream : CStream
|
||||
|
||||
@end
|
||||
|
||||
#endif /* __TextCStream_h_OBJECTS_INCLUDE */
|
339
Source/BinaryCStream.m
Normal file
339
Source/BinaryCStream.m
Normal file
|
@ -0,0 +1,339 @@
|
|||
/* Implementation of GNU Objective-C binary stream object for use serializing
|
||||
Copyright (C) 1996 Free Software Foundation, Inc.
|
||||
|
||||
Written by: R. Andrew McCallum <mccallum@gnu.ai.mit.edu>
|
||||
Written: Jan 1996
|
||||
|
||||
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 <objects/stdobjects.h>
|
||||
#include <objects/BinaryCStream.h>
|
||||
#include <objects/NSString.h>
|
||||
#include <objects/StdioStream.h>
|
||||
#include <objects/TextCStream.h>
|
||||
|
||||
#define DEFAULT_FORMAT_VERSION 0
|
||||
|
||||
@implementation BinaryCStream
|
||||
|
||||
|
||||
/* For debugging */
|
||||
|
||||
static BOOL debug_binary_coder;
|
||||
|
||||
+ setDebugging: (BOOL)f
|
||||
{
|
||||
debug_binary_coder = f;
|
||||
return self;
|
||||
}
|
||||
|
||||
+ debugStderrCoder
|
||||
{
|
||||
static id c = nil;
|
||||
|
||||
if (!c)
|
||||
c = [[TextCStream alloc]
|
||||
initForWritingToStream: [StdioStream standardError]];
|
||||
return c;
|
||||
}
|
||||
|
||||
- (void) encodeName: (id <String>) name
|
||||
{
|
||||
if (debug_binary_coder)
|
||||
[[[self class] debugStderrCoder]
|
||||
encodeName:name];
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Encoding/decoding C values */
|
||||
|
||||
- (void) encodeValueOfCType: (const char*)type
|
||||
at: (const void*)d
|
||||
withName: (id <String>) name
|
||||
{
|
||||
unsigned char size;
|
||||
|
||||
if (debug_binary_coder)
|
||||
{
|
||||
[[[self class] debugStderrCoder]
|
||||
encodeValueOfCType:type
|
||||
at:d
|
||||
withName:name];
|
||||
}
|
||||
assert(type);
|
||||
assert(*type != '@');
|
||||
assert(*type != '^');
|
||||
assert(*type != ':');
|
||||
assert(*type != '{');
|
||||
assert(*type != '[');
|
||||
|
||||
/* A fairly stupid, inefficient binary encoding. This could use
|
||||
some improvement. For instance, we could compress the sign
|
||||
information and the type information.
|
||||
It could probably also use some portability fixes. */
|
||||
[stream writeByte:*type];
|
||||
size = objc_sizeof_type(type);
|
||||
[stream writeByte:size];
|
||||
switch (*type)
|
||||
{
|
||||
case _C_CHARPTR:
|
||||
{
|
||||
int length = strlen(*(char**)d);
|
||||
[self encodeValueOfCType:@encode(int)
|
||||
at:&length withName:@"BinaryCoder char* length"];
|
||||
[stream writeBytes:*(char**)d length:length];
|
||||
break;
|
||||
}
|
||||
|
||||
case _C_CHR:
|
||||
#ifndef __CHAR_UNSIGNED__
|
||||
if (*(char*)d < 0)
|
||||
[stream writeByte:1];
|
||||
else
|
||||
#endif
|
||||
[stream writeByte:0];
|
||||
case _C_UCHR:
|
||||
[stream writeByte:*(unsigned char*)d];
|
||||
break;
|
||||
|
||||
case _C_SHT:
|
||||
if (*(short*)d < 0)
|
||||
[stream writeByte:1];
|
||||
else
|
||||
[stream writeByte:0];
|
||||
case _C_USHT:
|
||||
{
|
||||
unsigned char *buf = alloca(size);
|
||||
short s = *(short*)d;
|
||||
int count = size;
|
||||
if (s < 0) s = -s;
|
||||
for (; count--; s >>= 8)
|
||||
buf[count] = (char) (s % 0x100);
|
||||
[stream writeBytes:buf length:size];
|
||||
break;
|
||||
}
|
||||
|
||||
case _C_INT:
|
||||
if (*(int*)d < 0)
|
||||
[stream writeByte:1];
|
||||
else
|
||||
[stream writeByte:0];
|
||||
case _C_UINT:
|
||||
{
|
||||
unsigned char *buf = alloca(size);
|
||||
int s = *(int*)d;
|
||||
int count = size;
|
||||
if (s < 0) s = -s;
|
||||
for (; count--; s >>= 8)
|
||||
buf[count] = (char) (s % 0x100);
|
||||
[stream writeBytes:buf length:size];
|
||||
break;
|
||||
}
|
||||
|
||||
case _C_LNG:
|
||||
if (*(long*)d < 0)
|
||||
[stream writeByte:1];
|
||||
else
|
||||
[stream writeByte:0];
|
||||
case _C_ULNG:
|
||||
{
|
||||
unsigned char *buf = alloca(size);
|
||||
long s = *(long*)d;
|
||||
int count = size;
|
||||
if (s < 0) s = -s;
|
||||
for (; count--; s >>= 8)
|
||||
buf[count] = (char) (s % 0x100);
|
||||
[stream writeBytes:buf length:size];
|
||||
break;
|
||||
}
|
||||
|
||||
/* Two quickie kludges to make archiving of floats and doubles work */
|
||||
case _C_FLT:
|
||||
{
|
||||
char buf[64];
|
||||
char *s = buf;
|
||||
sprintf(buf, "%f", *(float*)d);
|
||||
[self encodeValueOfCType:@encode(char*)
|
||||
at:&s withName:@"BinaryCoder float"];
|
||||
break;
|
||||
}
|
||||
case _C_DBL:
|
||||
{
|
||||
char buf[64];
|
||||
char *s = buf;
|
||||
sprintf(buf, "%f", *(double*)d);
|
||||
[self encodeValueOfCType:@encode(char*)
|
||||
at:&s withName:@"BinaryCoder double"];
|
||||
break;
|
||||
}
|
||||
default:
|
||||
[self error:"Unrecognized Type %s", type];
|
||||
}
|
||||
}
|
||||
|
||||
- (void) decodeValueOfCType: (const char*)type
|
||||
at: (void*)d
|
||||
withName: (id <String> *)namePtr
|
||||
{
|
||||
char encoded_type;
|
||||
unsigned char encoded_size;
|
||||
unsigned char encoded_sign = 0;
|
||||
|
||||
assert(type);
|
||||
assert(*type != '@');
|
||||
assert(*type != '^');
|
||||
assert(*type != ':');
|
||||
assert(*type != '{');
|
||||
assert(*type != '[');
|
||||
|
||||
[stream readByte:&encoded_type];
|
||||
if (encoded_type != *type
|
||||
&& !((encoded_type=='c' || encoded_type=='C')
|
||||
&& (*type=='c' || *type=='C')))
|
||||
[self error:"Expected type \"%c\", got type \"%c\"", *type, encoded_type];
|
||||
[stream readByte:&encoded_size];
|
||||
switch (encoded_type)
|
||||
{
|
||||
case _C_CHARPTR:
|
||||
{
|
||||
int length;
|
||||
[self decodeValueOfCType:@encode(int)
|
||||
at:&length withName:NULL];
|
||||
OBJC_MALLOC(*(char**)d, char, length+1);
|
||||
[stream readBytes:*(char**)d length:length];
|
||||
(*(char**)d)[length] = '\0';
|
||||
break;
|
||||
}
|
||||
|
||||
case _C_CHR:
|
||||
[stream readByte:&encoded_sign];
|
||||
case _C_UCHR:
|
||||
[stream readByte:(unsigned char*)d];
|
||||
if (encoded_sign)
|
||||
*(char*)d = *(char*)d * -1;
|
||||
break;
|
||||
|
||||
case _C_SHT:
|
||||
[stream readByte:&encoded_sign];
|
||||
case _C_USHT:
|
||||
{
|
||||
unsigned char *buf = alloca(encoded_size);
|
||||
int i;
|
||||
short s = 0;
|
||||
[stream readBytes:buf length:encoded_size];
|
||||
for (i = 0; i < sizeof(short); i++)
|
||||
{
|
||||
s <<= 8;
|
||||
s += buf[i];
|
||||
}
|
||||
if (encoded_sign)
|
||||
s = -s;
|
||||
*(short*)d = s;
|
||||
break;
|
||||
}
|
||||
|
||||
case _C_INT:
|
||||
[stream readByte:&encoded_sign];
|
||||
case _C_UINT:
|
||||
{
|
||||
unsigned char *buf = alloca(encoded_size);
|
||||
int i;
|
||||
int s = 0;
|
||||
[stream readBytes:buf length:encoded_size];
|
||||
for (i = 0; i < sizeof(int); i++)
|
||||
{
|
||||
s <<= 8;
|
||||
s += buf[i];
|
||||
}
|
||||
if (encoded_sign)
|
||||
s = -s;
|
||||
*(int*)d = s;
|
||||
break;
|
||||
}
|
||||
|
||||
case _C_LNG:
|
||||
[stream readByte:&encoded_sign];
|
||||
case _C_ULNG:
|
||||
{
|
||||
unsigned char *buf = alloca(encoded_size);
|
||||
int i;
|
||||
long s = 0;
|
||||
[stream readBytes:buf length:encoded_size];
|
||||
for (i = 0; i < sizeof(long); i++)
|
||||
{
|
||||
s <<= 8;
|
||||
s += buf[i];
|
||||
}
|
||||
if (encoded_sign)
|
||||
s = -s;
|
||||
*(long*)d = s;
|
||||
break;
|
||||
}
|
||||
|
||||
/* Two quickie kludges to make archiving of floats and doubles work */
|
||||
case _C_FLT:
|
||||
{
|
||||
char *buf;
|
||||
[self decodeValueOfCType:@encode(char*) at:&buf withName:NULL];
|
||||
if (sscanf(buf, "%f", (float*)d) != 1)
|
||||
[self error:"expected float, got %s", buf];
|
||||
(*objc_free)(buf);
|
||||
break;
|
||||
}
|
||||
case _C_DBL:
|
||||
{
|
||||
char *buf;
|
||||
[self decodeValueOfCType:@encode(char*) at:&buf withName:NULL];
|
||||
if (sscanf(buf, "%lf", (double*)d) != 1)
|
||||
[self error:"expected double, got %s", buf];
|
||||
(*objc_free)(buf);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
[self error:"Unrecognized Type %s", type];
|
||||
}
|
||||
|
||||
if (debug_binary_coder)
|
||||
{
|
||||
[[[self class] debugStderrCoder]
|
||||
encodeValueOfCType:type
|
||||
at:d
|
||||
withName:@"decoding unnamed"];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Returning default format version. */
|
||||
|
||||
+ (int) defaultFormatVersion
|
||||
{
|
||||
return DEFAULT_FORMAT_VERSION;
|
||||
}
|
||||
|
||||
- (void) decodeName: (id <String> *)n
|
||||
{
|
||||
#if 1
|
||||
*n = nil;
|
||||
#else
|
||||
*n = [[[NSString alloc] init] autorelease];
|
||||
#endif
|
||||
}
|
||||
|
||||
@end
|
||||
|
231
Source/CStream.m
Normal file
231
Source/CStream.m
Normal file
|
@ -0,0 +1,231 @@
|
|||
/* Implementation of GNU Objective-C class for streaming C types and indentatn
|
||||
Copyright (C) 1994, 1995, 1996 Free Software Foundation, Inc.
|
||||
|
||||
Written by: R. Andrew McCallum <mccallum@gnu.ai.mit.edu>
|
||||
Date: July 1994
|
||||
|
||||
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 <objects/stdobjects.h>
|
||||
#include <objects/CStream.h>
|
||||
#include <objects/NSString.h>
|
||||
#include <objects/StdioStream.h>
|
||||
#include <Foundation/NSException.h>
|
||||
#include <assert.h>
|
||||
|
||||
id CStreamSignatureMalformedException = @"CStreamSignatureMalformedException";
|
||||
id CStreamSignatureMismatchException = @"CStreamSignatureMismatchException";
|
||||
|
||||
@implementation CStream
|
||||
|
||||
|
||||
/* Encoding/decoding C values */
|
||||
|
||||
- (void) encodeValueOfCType: (const char*) type
|
||||
at: (const void*) d
|
||||
withName: (id <String>) name;
|
||||
{
|
||||
[self subclassResponsibility:_cmd];
|
||||
}
|
||||
|
||||
- (void) decodeValueOfCType: (const char*) type
|
||||
at: (void*) d
|
||||
withName: (id <String> *) namePtr;
|
||||
{
|
||||
[self subclassResponsibility:_cmd];
|
||||
}
|
||||
|
||||
|
||||
/* Signature methods. */
|
||||
|
||||
#define SIGNATURE_FORMAT_STRING \
|
||||
@"GNU Objective C Class Library %s version %d\n"
|
||||
|
||||
- (void) writeSignature
|
||||
{
|
||||
/* Careful: the string should not contain newlines. */
|
||||
[stream writeFormat: SIGNATURE_FORMAT_STRING,
|
||||
object_get_class_name(self),
|
||||
format_version];
|
||||
}
|
||||
|
||||
+ (void) readSignatureFromStream: s
|
||||
getClassname: (char *) name
|
||||
formatVersion: (int*) version
|
||||
{
|
||||
int got;
|
||||
|
||||
got = [s readFormat: SIGNATURE_FORMAT_STRING,
|
||||
name, version];
|
||||
if (got != 2)
|
||||
[NSException raise:CStreamSignatureMalformedException
|
||||
format: @"CStream found a malformed signature"];
|
||||
}
|
||||
|
||||
|
||||
/* Initialization methods */
|
||||
|
||||
/* This is the hidden designated initializer. Do not call it yourself. */
|
||||
- _initWithStream: (id <Streaming>) s
|
||||
formatVersion: (int)version
|
||||
{
|
||||
[super init];
|
||||
[s retain];
|
||||
stream = s;
|
||||
format_version = version;
|
||||
indentation = 0;
|
||||
return self;
|
||||
}
|
||||
|
||||
- initForReadingFromStream: (id <Streaming>) s
|
||||
formatVersion: (int)version
|
||||
{
|
||||
[self _initWithStream: s
|
||||
formatVersion: version];
|
||||
if ([stream streamPosition] != 0)
|
||||
{
|
||||
char name[128]; /* max class name length. */
|
||||
int version;
|
||||
[[self class] readSignatureFromStream: stream
|
||||
getClassname: name
|
||||
formatVersion: &version];
|
||||
if (!strcmp(name, object_get_class_name(self))
|
||||
|| version != format_version)
|
||||
{
|
||||
[NSException raise: CStreamSignatureMismatchException
|
||||
format: @"CStream found a mismatched signature"];
|
||||
}
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
+ cStreamReadingFromStream: (id <Streaming>) s
|
||||
{
|
||||
char name[128]; /* Maximum class name length. */
|
||||
int version;
|
||||
id new_cstream;
|
||||
|
||||
[self readSignatureFromStream: s
|
||||
getClassname: name
|
||||
formatVersion: &version];
|
||||
new_cstream = [[objc_lookup_class(name) alloc]
|
||||
_initWithStream: s
|
||||
formatVersion: version];
|
||||
return [new_cstream autorelease];
|
||||
}
|
||||
|
||||
+ cStreamReadingFromFile: (id <String>) filename
|
||||
{
|
||||
return [self cStreamReadingFromStream:
|
||||
[StdioStream streamWithFilename: filename fmode: "r"]];
|
||||
}
|
||||
|
||||
/* This is a designated initializer for writing. */
|
||||
- initForWritingToStream: (id <Streaming>) s
|
||||
formatVersion: (int)version
|
||||
{
|
||||
[self _initWithStream: s
|
||||
formatVersion: version];
|
||||
[self writeSignature];
|
||||
return self;
|
||||
}
|
||||
|
||||
- initForWritingToStream: (id <Streaming>) s
|
||||
{
|
||||
[self initForWritingToStream: s
|
||||
formatVersion: [[self class] defaultFormatVersion]];
|
||||
}
|
||||
|
||||
- initForWritingToFile: (id <String>) file
|
||||
{
|
||||
return [self initForWritingToStream:
|
||||
[StdioStream streamWithFilename: file fmode: "w"]];
|
||||
}
|
||||
|
||||
+ cStreamWritingToStream: (id <Streaming>) s
|
||||
{
|
||||
return [[[self alloc] initForWritingToStream: s]
|
||||
autorelease];
|
||||
}
|
||||
|
||||
+ cStreamWritingToFile: (id <String>) filename;
|
||||
{
|
||||
return [[[self alloc] initForWritingToFile: filename]
|
||||
autorelease];
|
||||
}
|
||||
|
||||
|
||||
/* Encoding/decoding indentation */
|
||||
|
||||
- (void) encodeIndent
|
||||
{
|
||||
/* Do nothing */
|
||||
}
|
||||
|
||||
- (void) encodeUnindent
|
||||
{
|
||||
/* Do nothing */
|
||||
}
|
||||
|
||||
- (void) decodeIndent
|
||||
{
|
||||
/* Do nothing */
|
||||
}
|
||||
|
||||
- (void) decodeUnindent
|
||||
{
|
||||
/* Do nothing */
|
||||
}
|
||||
|
||||
- (void) encodeName: (id <String>) n
|
||||
{
|
||||
/* Do nothing */
|
||||
}
|
||||
|
||||
- (void) decodeName: (id <String> *) name
|
||||
{
|
||||
/* Do nothing */
|
||||
}
|
||||
|
||||
|
||||
/* Access to the underlying stream. */
|
||||
|
||||
- (id <Streaming>) stream
|
||||
{
|
||||
return stream;
|
||||
}
|
||||
|
||||
|
||||
/* Deallocation. */
|
||||
|
||||
- (void) dealloc
|
||||
{
|
||||
[stream release];
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
|
||||
/* Returning default format version. */
|
||||
|
||||
+ (int) defaultFormatVersion
|
||||
{
|
||||
[self subclassResponsibility:_cmd];
|
||||
return 0;
|
||||
}
|
||||
|
||||
@end
|
381
Source/TextCStream.m
Normal file
381
Source/TextCStream.m
Normal file
|
@ -0,0 +1,381 @@
|
|||
/* Implementation of GNU Objective-C text stream object for use serializing
|
||||
Copyright (C) 1996 Free Software Foundation, Inc.
|
||||
|
||||
Written by: R. Andrew McCallum <mccallum@gnu.ai.mit.edu>
|
||||
Written: Jan 1996
|
||||
|
||||
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 <objects/stdobjects.h>
|
||||
#include <objects/TextCStream.h>
|
||||
#include <objects/NSString.h>
|
||||
#include <objects/StdioStream.h>
|
||||
|
||||
#define DEFAULT_FORMAT_VERSION 0
|
||||
|
||||
static BOOL debug_textcoder = NO;
|
||||
|
||||
@implementation TextCStream
|
||||
|
||||
|
||||
/* Encoding/decoding C values */
|
||||
|
||||
#define XSTR(s) STR(s)
|
||||
#define STR(s) #s
|
||||
|
||||
#define ATXSTR(s) ATSTR(s)
|
||||
#define ATSTR(s) @#s
|
||||
|
||||
#define ROUND(V, A) \
|
||||
({ typeof(V) __v=(V); typeof(A) __a=(A); \
|
||||
__a*((__v+__a-1)/__a); })
|
||||
|
||||
#define ENCODER_FORMAT(TYPE, CONVERSION) \
|
||||
@"%*s<%s> (" ATXSTR(TYPE) @") = %" ATXSTR(CONVERSION) @"\n"
|
||||
|
||||
- (void) encodeValueOfCType: (const char*) type
|
||||
at: (const void*) d
|
||||
withName: (id <String>) name;
|
||||
{
|
||||
if (!name)
|
||||
name = @"";
|
||||
switch (*type)
|
||||
{
|
||||
case _C_LNG:
|
||||
[stream writeFormat:@"%*s<%@> (long) = %ld\n",
|
||||
indentation, "", name, *(long*)d];
|
||||
break;
|
||||
case _C_ULNG:
|
||||
[stream writeFormat:@"%*s<%@> (unsigned long) = %lu\n",
|
||||
indentation, "", name, *(unsigned long*)d];
|
||||
break;
|
||||
case _C_INT:
|
||||
[stream writeFormat:@"%*s<%@> (int) = %d\n",
|
||||
indentation, "", name, *(int*)d];
|
||||
break;
|
||||
case _C_UINT:
|
||||
[stream writeFormat:@"%*s<%@> (unsigned int) = %u\n",
|
||||
indentation, "", name, *(unsigned int*)d];
|
||||
break;
|
||||
case _C_SHT:
|
||||
[stream writeFormat:@"%*s<%@> (short) = %d\n",
|
||||
indentation, "", name, (int)*(short*)d];
|
||||
break;
|
||||
case _C_USHT:
|
||||
[stream writeFormat:@"%*s<%@> (unsigned short) = %u\n",
|
||||
indentation, "", name, (unsigned)*(unsigned short*)d];
|
||||
break;
|
||||
case _C_CHR:
|
||||
[stream writeFormat:@"%*s<%@> (char) = %c (0x%x)\n",
|
||||
indentation, "", name, *(char*)d, (unsigned)*(char*)d];
|
||||
break;
|
||||
case _C_UCHR:
|
||||
[stream writeFormat:@"%*s<%@> (unsigned char) = 0x%x\n",
|
||||
indentation, "", name, (unsigned)*(unsigned char*)d];
|
||||
break;
|
||||
case _C_FLT:
|
||||
[stream writeFormat:@"%*s<%@> (float) = %g\n",
|
||||
indentation, "", name, *(float*)d];
|
||||
break;
|
||||
case _C_DBL:
|
||||
[stream writeFormat:@"%*s<%@> (double) = %g\n",
|
||||
indentation, "", name, *(double*)d];
|
||||
break;
|
||||
case _C_CHARPTR:
|
||||
[stream writeFormat:@"%*s<%@> (char*) = \"%s\"\n",
|
||||
indentation, "", name, *(char**)d];
|
||||
break;
|
||||
case _C_ARY_B:
|
||||
{
|
||||
int len = atoi (type+1); /* xxx why +1 ? */
|
||||
int offset;
|
||||
|
||||
while (isdigit(*++type));
|
||||
offset = objc_sizeof_type(type);
|
||||
[self encodeName:name];
|
||||
[self encodeIndent];
|
||||
while (len-- > 0)
|
||||
{
|
||||
/* Change this so we don't re-write type info every time. */
|
||||
[self encodeValueOfCType:type
|
||||
at:d
|
||||
withName:@"array component"];
|
||||
((char*)d) += offset;
|
||||
}
|
||||
[self encodeUnindent];
|
||||
break;
|
||||
}
|
||||
case _C_STRUCT_B:
|
||||
{
|
||||
int acc_size = 0;
|
||||
int align;
|
||||
|
||||
while (*type != _C_STRUCT_E && *type++ != '='); /* skip "<name>=" */
|
||||
[self encodeName:name];
|
||||
[self encodeIndent];
|
||||
while (*type != _C_STRUCT_E)
|
||||
{
|
||||
align = objc_alignof_type (type); /* pad to alignment */
|
||||
acc_size = ROUND (acc_size, align);
|
||||
[self encodeValueOfCType:type
|
||||
at:((char*)d)+acc_size
|
||||
withName:@"structure component"];
|
||||
acc_size += objc_sizeof_type (type); /* add component size */
|
||||
type = objc_skip_typespec (type); /* skip component */
|
||||
}
|
||||
[self encodeUnindent];
|
||||
break;
|
||||
}
|
||||
case _C_PTR:
|
||||
[self error:"Cannot encode pointers"];
|
||||
break;
|
||||
#if 0 /* No, don't know how far to recurse */
|
||||
[self encodeValueOfObjCType:type+1 at:*(char**)d withName:name];
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
[self error:"type %s not implemented", type];
|
||||
}
|
||||
}
|
||||
|
||||
#define DECODER_FORMAT(TYPE, CONVERSION) \
|
||||
@" <%a[^>]> (" ATXSTR(TYPE) @") = %" ATXSTR(CONVERSION) @" \n"
|
||||
|
||||
#define DECODE_ERROR(TYPE) [self error:"bad format decoding " XSTR(TYPE)]
|
||||
|
||||
#define DECODE_DEBUG(TYPE, CONVERSION) \
|
||||
if (debug_textcoder) \
|
||||
[[StdioStream standardError] writeFormat: \
|
||||
@"got <%s> (%s) %" ATXSTR(CONVERSION) @"\n", \
|
||||
tmpname, \
|
||||
XSTR(TYPE), *(TYPE*)d];
|
||||
|
||||
- (void) decodeValueOfCType: (const char*) type
|
||||
at: (void*) d
|
||||
withName: (id <String> *) namePtr;
|
||||
{
|
||||
char *tmpname;
|
||||
|
||||
assert (d);
|
||||
switch (*type)
|
||||
{
|
||||
case _C_LNG:
|
||||
if ([stream readFormat: DECODER_FORMAT(long,l),
|
||||
&tmpname, (long*)d] != 2)
|
||||
DECODE_ERROR(long);
|
||||
DECODE_DEBUG(long, l);
|
||||
break;
|
||||
case _C_ULNG:
|
||||
if ([stream readFormat:DECODER_FORMAT(unsigned long, lu),
|
||||
&tmpname, (unsigned long*)d] != 2)
|
||||
DECODE_ERROR(unsigned long);
|
||||
DECODE_DEBUG(unsigned long, lu);
|
||||
break;
|
||||
case _C_INT:
|
||||
if ([stream readFormat:DECODER_FORMAT(int, d),
|
||||
&tmpname, (int*)d] != 2)
|
||||
DECODE_ERROR(int);
|
||||
DECODE_DEBUG(int, d);
|
||||
break;
|
||||
case _C_UINT:
|
||||
if ([stream readFormat:DECODER_FORMAT(unsigned int,u),
|
||||
&tmpname, (unsigned int*)d] != 2)
|
||||
DECODE_ERROR(unsigned int);
|
||||
DECODE_DEBUG(unsigned int, u);
|
||||
break;
|
||||
case _C_SHT:
|
||||
if ([stream readFormat:DECODER_FORMAT(short,hd),
|
||||
&tmpname, (short*)d] != 2)
|
||||
DECODE_ERROR(short);
|
||||
DECODE_DEBUG(short, d);
|
||||
break;
|
||||
case _C_USHT:
|
||||
if ([stream readFormat:DECODER_FORMAT(unsigned short,hu),
|
||||
&tmpname, (unsigned short*)d] != 2)
|
||||
DECODE_ERROR(unsigned short);
|
||||
DECODE_DEBUG(unsigned short, u);
|
||||
break;
|
||||
case _C_CHR:
|
||||
{
|
||||
unsigned tmp;
|
||||
if ([stream readFormat:@" <%a[^>]> (char) = %*c (%x) \n",
|
||||
&tmpname, &tmp] != 2)
|
||||
DECODE_ERROR(char);
|
||||
*(char*)d = (char)tmp;
|
||||
DECODE_DEBUG(char, c);
|
||||
break;
|
||||
}
|
||||
case _C_UCHR:
|
||||
{
|
||||
unsigned tmp;
|
||||
if ([stream readFormat:DECODER_FORMAT(unsigned char,x),
|
||||
&tmpname, &tmp] != 2)
|
||||
DECODE_ERROR(unsigned char);
|
||||
*(unsigned char*)d = (unsigned char)tmp;
|
||||
DECODE_DEBUG(unsigned char, c);
|
||||
break;
|
||||
}
|
||||
case _C_FLT:
|
||||
if ([stream readFormat:DECODER_FORMAT(float,f),
|
||||
&tmpname, (float*)d] != 2)
|
||||
DECODE_ERROR(float);
|
||||
DECODE_DEBUG(float, f);
|
||||
break;
|
||||
case _C_DBL:
|
||||
if ([stream readFormat:DECODER_FORMAT(double,lf),
|
||||
&tmpname, (double*)d] != 2)
|
||||
DECODE_ERROR(double);
|
||||
DECODE_DEBUG(double, f);
|
||||
break;
|
||||
case _C_CHARPTR:
|
||||
if ([stream readFormat:@" <%a[^>]> (char*) = \"%a[^\"]\" \n",
|
||||
&tmpname, (char**)d] != 2)
|
||||
DECODE_ERROR(char*);
|
||||
DECODE_DEBUG(char*, s);
|
||||
break;
|
||||
case _C_ARY_B:
|
||||
{
|
||||
/* xxx Do we need to allocate space, just like _C_CHARPTR ? */
|
||||
int len = atoi(type+1);
|
||||
int offset;
|
||||
[self decodeName:namePtr];
|
||||
[self decodeIndent];
|
||||
while (isdigit(*++type));
|
||||
offset = objc_sizeof_type(type);
|
||||
while (len-- > 0)
|
||||
{
|
||||
[self decodeValueOfCType:type
|
||||
at:d
|
||||
withName:namePtr];
|
||||
((char*)d) += offset;
|
||||
}
|
||||
[self decodeUnindent];
|
||||
break;
|
||||
}
|
||||
case _C_STRUCT_B:
|
||||
{
|
||||
/* xxx Do we need to allocate space just like char* ? No. */
|
||||
int acc_size = 0;
|
||||
int align;
|
||||
while (*type != _C_STRUCT_E && *type++ != '='); /* skip "<name>=" */
|
||||
[self decodeName:namePtr];
|
||||
[self decodeIndent]; /* xxx insert [self decodeName:] */
|
||||
while (*type != _C_STRUCT_E)
|
||||
{
|
||||
align = objc_alignof_type (type); /* pad to alignment */
|
||||
acc_size = ROUND (acc_size, align);
|
||||
[self decodeValueOfCType:type
|
||||
at:((char*)d)+acc_size
|
||||
withName:namePtr];
|
||||
acc_size += objc_sizeof_type (type); /* add component size */
|
||||
type = objc_skip_typespec (type); /* skip component */
|
||||
}
|
||||
[self decodeUnindent];
|
||||
break;
|
||||
}
|
||||
case _C_PTR:
|
||||
[self error:"Cannot decode pointers"];
|
||||
break;
|
||||
#if 0 /* No, don't know how far to recurse */
|
||||
OBJC_MALLOC(*(void**)d, void*, 1);
|
||||
[self decodeValueOfObjCType:type+1 at:*(char**)d withName:namePtr];
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
[self error:"type %s not yet implemented", type];
|
||||
}
|
||||
if (namePtr)
|
||||
*namePtr = [NSString stringWithCStringNoCopy: tmpname];
|
||||
else
|
||||
(*objc_free) (tmpname);
|
||||
}
|
||||
|
||||
|
||||
/* Encoding/decoding indentation */
|
||||
|
||||
- (void) encodeIndent
|
||||
{
|
||||
[stream writeFormat: @"%*s {\n", indentation, ""];
|
||||
indentation += 2;
|
||||
}
|
||||
|
||||
- (void) encodeUnindent
|
||||
{
|
||||
indentation -= 2;
|
||||
[stream writeFormat: @"%*s }\n", indentation, ""];
|
||||
}
|
||||
|
||||
- (void) decodeIndent
|
||||
{
|
||||
id line;
|
||||
const char *lp;
|
||||
|
||||
line = [stream readLine];
|
||||
lp = [line cStringNoCopy];
|
||||
while (*lp == ' ') lp++;
|
||||
if (*lp != '{')
|
||||
[self error:"bad indent format, got \"%s\"", line];
|
||||
}
|
||||
|
||||
- (void) decodeUnindent
|
||||
{
|
||||
id line;
|
||||
const char *lp;
|
||||
|
||||
line = [stream readLine];
|
||||
lp = [line cStringNoCopy];
|
||||
while (*lp == ' ') lp++;
|
||||
if (*lp != '}')
|
||||
[self error:"bad unindent format, got \"%s\"", line];
|
||||
}
|
||||
|
||||
- (void) encodeName: (id <String>) n
|
||||
{
|
||||
if (n)
|
||||
[stream writeFormat:@"%*s<%@>\n", indentation, "", n];
|
||||
else
|
||||
[stream writeFormat:@"%*s<NULL>\n", indentation, ""];
|
||||
}
|
||||
|
||||
- (void) decodeName: (id <String> *) name
|
||||
{
|
||||
const char *n;
|
||||
if (name)
|
||||
{
|
||||
if ([stream readFormat: @" <%a[^>]> \n", &n] != 1)
|
||||
[self error:"bad format"];
|
||||
*name = [NSString stringWithCStringNoCopy: n
|
||||
freeWhenDone: YES];
|
||||
if (debug_textcoder)
|
||||
fprintf(stderr, "got name <%s>\n", *n);
|
||||
}
|
||||
else
|
||||
{
|
||||
[stream readFormat: @" <%*[^>]> \n"];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Returning default format version. */
|
||||
|
||||
+ (int) defaultFormatVersion
|
||||
{
|
||||
return DEFAULT_FORMAT_VERSION;
|
||||
}
|
||||
|
||||
@end
|
35
Source/objects/BinaryCStream.h
Normal file
35
Source/objects/BinaryCStream.h
Normal file
|
@ -0,0 +1,35 @@
|
|||
/* Interface for GNU Objective-C binary stream object for use serializing
|
||||
Copyright (C) 1996 Free Software Foundation, Inc.
|
||||
|
||||
Written by: R. Andrew McCallum <mccallum@gnu.ai.mit.edu>
|
||||
Written: Jan 1996
|
||||
|
||||
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.
|
||||
*/
|
||||
|
||||
#ifndef __BinaryCStream_h_OBJECTS_INCLUDE
|
||||
#define __BinaryCStream_h_OBJECTS_INCLUDE
|
||||
|
||||
#include <objects/stdobjects.h>
|
||||
#include <objects/Stream.h>
|
||||
#include <objects/CStream.h>
|
||||
|
||||
@interface BinaryCStream : CStream
|
||||
|
||||
@end
|
||||
|
||||
#endif /* __BinaryCStream_h_OBJECTS_INCLUDE */
|
55
Source/objects/CStream.h
Normal file
55
Source/objects/CStream.h
Normal file
|
@ -0,0 +1,55 @@
|
|||
/* Interface for GNU Objective-C stream object for use in archiving
|
||||
Copyright (C) 1996 Free Software Foundation, Inc.
|
||||
|
||||
Written by: R. Andrew McCallum <mccallum@gnu.ai.mit.edu>
|
||||
Written: Jan 1996
|
||||
|
||||
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.
|
||||
*/
|
||||
|
||||
#ifndef __CStream_h_OBJECTS_INCLUDE
|
||||
#define __CStream_h_OBJECTS_INCLUDE
|
||||
|
||||
#include <objects/stdobjects.h>
|
||||
#include <objects/Stream.h>
|
||||
#include <objects/CStreaming.h>
|
||||
|
||||
@interface CStream : Stream <CStreaming>
|
||||
{
|
||||
Stream *stream;
|
||||
int format_version;
|
||||
int indentation;
|
||||
}
|
||||
|
||||
/* These are standard ways to create a new CStream from a Stream
|
||||
that is open for reading.
|
||||
It reads the CStream signature at the beginning of the file, and
|
||||
automatically creates the appropriate subclass of CStream with
|
||||
the correct format version. */
|
||||
+ cStreamReadingFromFile: (id <String>) filename;
|
||||
+ cStreamReadingFromStream: (id <Streaming>) stream;
|
||||
|
||||
/* These are standard ways to create a new CStream with a Stream
|
||||
that is open for writing. */
|
||||
- initForWritingToFile: (id <String>) filename;
|
||||
- initForWritingToStream: (id <Streaming>) stream;
|
||||
+ cStreamWritingToStream: (id <Streaming>) stream;
|
||||
+ cStreamWritingToFile: (id <String>) filename;
|
||||
|
||||
@end
|
||||
|
||||
#endif /* __CStream_h_OBJECTS_INCLUDE */
|
56
Source/objects/CStreaming.h
Normal file
56
Source/objects/CStreaming.h
Normal file
|
@ -0,0 +1,56 @@
|
|||
/* Protocol for GNU Objective C byte streams that can code C types and indentn
|
||||
Copyright (C) 1995, 1996 Free Software Foundation, Inc.
|
||||
|
||||
Written by: R. Andrew McCallum <mccallum@gnu.ai.mit.edu>
|
||||
Date: April 1995
|
||||
|
||||
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.
|
||||
*/
|
||||
|
||||
#ifndef __CStreaming_h__OBJECTS_INCLUDE
|
||||
#define __CStreaming_h__OBJECTS_INCLUDE
|
||||
|
||||
#include <objects/stdobjects.h>
|
||||
#include <objects/Streaming.h>
|
||||
|
||||
@protocol CStreaming <Streaming>
|
||||
|
||||
- (void) encodeValueOfCType: (const char*) type
|
||||
at: (const void*) d
|
||||
withName: (id <String>) name;
|
||||
|
||||
- (void) decodeValueOfCType: (const char*) type
|
||||
at: (void*) d
|
||||
withName: (id <String> *) namePtr;
|
||||
|
||||
- (void) encodeName: (id <String>) name;
|
||||
- (void) decodeName: (id <String> *) name;
|
||||
|
||||
- (void) encodeIndent;
|
||||
- (void) decodeIndent;
|
||||
|
||||
- (void) encodeUnindent;
|
||||
- (void) decodeUnindent;
|
||||
|
||||
- (id <Streaming>) stream;
|
||||
|
||||
+ (int) defaultFormatVersion;
|
||||
|
||||
@end
|
||||
|
||||
#endif /* __CStreaming_h__OBJECTS_INCLUDE */
|
||||
|
35
Source/objects/TextCStream.h
Normal file
35
Source/objects/TextCStream.h
Normal file
|
@ -0,0 +1,35 @@
|
|||
/* Interface for GNU Objective-C text stream object for use serializing
|
||||
Copyright (C) 1996 Free Software Foundation, Inc.
|
||||
|
||||
Written by: R. Andrew McCallum <mccallum@gnu.ai.mit.edu>
|
||||
Written: Jan 1996
|
||||
|
||||
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.
|
||||
*/
|
||||
|
||||
#ifndef __TextCStream_h_OBJECTS_INCLUDE
|
||||
#define __TextCStream_h_OBJECTS_INCLUDE
|
||||
|
||||
#include <objects/stdobjects.h>
|
||||
#include <objects/Stream.h>
|
||||
#include <objects/CStream.h>
|
||||
|
||||
@interface TextCStream : CStream
|
||||
|
||||
@end
|
||||
|
||||
#endif /* __TextCStream_h_OBJECTS_INCLUDE */
|
Loading…
Add table
Add a link
Reference in a new issue