1 #import "NSData+RSerialize.h"
3 typedef struct nsdata_reader {
9 int nsdata_in_char(R_inpstream_t stream) {
10 nsdata_reader_t *d = stream->data;
11 return d->buffer[d->index++];
13 void nsdata_in_bytes(R_inpstream_t stream,void*buffer,int size) {
14 nsdata_reader_t *d = stream->data;
15 if(size+d->index > [d->data length]) error("bad read length");
16 memcpy(buffer,&(d->buffer[d->index]),size);
20 @implementation NSData (RUnserialize)
21 + (NSData*)dataWithSEXP:(SEXP)obj {
22 NSMutableData *data = [[NSMutableData alloc] init];
24 return [data autorelease];
30 me.buffer = (char*)[self bytes];
33 struct R_inpstream_st stream;
35 R_InitInPStream(&stream,(R_pstream_data_t)&me,R_pstream_any_format,nsdata_in_char,nsdata_in_bytes,NULL,R_NilValue);
36 return R_Unserialize(&stream);
41 void nsdata_out_char(R_outpstream_t stream,int z) {
43 [(NSMutableData*)stream->data appendBytes:&c length:1];
46 void nsdata_out_bytes(R_outpstream_t stream,void*buffer,int size) {
47 [(NSMutableData*)stream->data appendBytes:buffer length:size];
50 @implementation NSMutableData (RSerialize)
52 - (void)serialize:(SEXP)object {
53 struct R_outpstream_st stream;
54 R_InitOutPStream(&stream,(R_pstream_data_t)self,R_pstream_xdr_format,0,nsdata_out_char,nsdata_out_bytes,NULL,R_NilValue);
55 R_Serialize(object,&stream);