minor edits
[RExecServer.git] / NSData+RSerialize.m
blobd04e92f204cbaa48496c76821925dedf4ca3acab
1 #import "NSData+RSerialize.h"
3 typedef struct nsdata_reader {
4         int     index;
5         NSData *data;
6         char   *buffer;
7 } nsdata_reader_t;
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);
17         d->index+=size;
20 @implementation NSData (RUnserialize)
21 + (NSData*)dataWithSEXP:(SEXP)obj {
22         NSMutableData *data = [[NSMutableData alloc] init];
23         [data serialize:obj];
24         return [data autorelease];
26 - (SEXP)unserialize {
27         nsdata_reader_t me;
28         me.index  = 0;
29         me.data   = self;
30         me.buffer = (char*)[self bytes];
31         
32         
33         struct R_inpstream_st stream;
34         
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);
39 @end
41 void nsdata_out_char(R_outpstream_t stream,int z) {
42         char c = 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);
58 @end