@@ -41,30 +41,35 @@ size_t receiver_recv(receiver *r, char* buf, size_t try_size) {
4141 return actual_size ;
4242}
4343
44+ size_t receiver_to_unpacker (receiver * r , size_t request_size ,
45+ msgpack_unpacker * unpacker )
46+ {
47+ // make sure there's enough room, or expand the unpacker accordingly
48+ if (msgpack_unpacker_buffer_capacity (unpacker ) < request_size ) {
49+ msgpack_unpacker_reserve_buffer (unpacker , request_size );
50+ assert (msgpack_unpacker_buffer_capacity (unpacker ) >= request_size );
51+ }
52+ size_t recv_len = receiver_recv (r , msgpack_unpacker_buffer (unpacker ),
53+ request_size );
54+ msgpack_unpacker_buffer_consumed (unpacker , recv_len );
55+ return recv_len ;
56+ }
57+
4458#define EACH_RECV_SIZE 4
4559
4660void unpack (receiver * r ) {
4761 /* buf is allocated by unpacker. */
4862 msgpack_unpacker * unp = msgpack_unpacker_new (100 );
4963 msgpack_unpacked result ;
5064 msgpack_unpack_return ret ;
51- char * buf ;
5265 size_t recv_len ;
5366 int recv_count = 0 ;
5467 int i = 0 ;
5568
5669 msgpack_unpacked_init (& result );
57- if (msgpack_unpacker_buffer_capacity (unp ) < EACH_RECV_SIZE ) {
58- bool expanded = msgpack_unpacker_reserve_buffer (unp , 100 );
59- assert (expanded );
60- }
61- buf = msgpack_unpacker_buffer (unp );
62-
63- recv_len = receiver_recv (r , buf , EACH_RECV_SIZE );
64- msgpack_unpacker_buffer_consumed (unp , recv_len );
65-
66-
67- while (recv_len > 0 ) {
70+ while (true) {
71+ recv_len = receiver_to_unpacker (r , EACH_RECV_SIZE , unp );
72+ if (recv_len == 0 ) break ; // (reached end of input)
6873 printf ("receive count: %d %zd bytes received.\n" , recv_count ++ , recv_len );
6974 ret = msgpack_unpacker_next (unp , & result );
7075 while (ret == MSGPACK_UNPACK_SUCCESS ) {
@@ -85,15 +90,9 @@ void unpack(receiver* r) {
8590 msgpack_unpacked_destroy (& result );
8691 return ;
8792 }
88- if (msgpack_unpacker_buffer_capacity (unp ) < EACH_RECV_SIZE ) {
89- bool expanded = msgpack_unpacker_reserve_buffer (unp , 100 );
90- assert (expanded );
91- }
92- buf = msgpack_unpacker_buffer (unp );
93- recv_len = receiver_recv (r , buf , 4 );
94- msgpack_unpacker_buffer_consumed (unp , recv_len );
9593 }
9694 msgpack_unpacked_destroy (& result );
95+ msgpack_unpacker_free (unp );
9796}
9897
9998int main (void ) {
0 commit comments