2020HvMessage * msg_init (HvMessage * m , hv_size_t numElements , hv_uint32_t timestamp ) {
2121 m -> timestamp = timestamp ;
2222 m -> numElements = (hv_uint16_t ) numElements ;
23- m -> numBytes = (hv_uint16_t ) msg_getByteSize (numElements );
23+ m -> numBytes = (hv_uint16_t ) msg_getCoreSize (numElements );
2424 return m ;
2525}
2626
@@ -43,7 +43,7 @@ HvMessage *msg_initWithBang(HvMessage *m, hv_uint32_t timestamp) {
4343HvMessage * msg_initWithSymbol (HvMessage * m , hv_uint32_t timestamp , char * s ) {
4444 m -> timestamp = timestamp ;
4545 m -> numElements = 1 ;
46- m -> numBytes = sizeof (HvMessage );
46+ m -> numBytes = sizeof (HvMessage ) + ( hv_uint16_t ) hv_strlen ( s ) ;
4747 msg_setSymbol (m , 0 , s );
4848 return m ;
4949}
@@ -56,51 +56,18 @@ HvMessage *msg_initWithHash(HvMessage *m, hv_uint32_t timestamp, hv_uint32_t h)
5656 return m ;
5757}
5858
59- HvMessage * msg_initV (HvMessage * const m , const hv_uint32_t timestamp , const char * format , ...) {
60- va_list ap ;
61- va_start (ap , format );
62-
63- const int numElem = (int ) hv_strlen (format );
64- msg_init (m , numElem , timestamp );
65- for (int i = 0 ; i < numElem ; i ++ ) {
66- switch (format [i ]) {
67- case 'b' : msg_setBang (m ,i ); break ;
68- case 'f' : msg_setFloat (m , i , (float ) va_arg (ap , double )); break ;
69- case 's' : msg_setSymbol (m , i , (char * ) va_arg (ap , char * )); break ;
70- case 'h' : // hash not supported
71- default : break ;
72- }
73- }
74- va_end (ap );
75-
76- return m ;
77- }
78-
79- hv_size_t msg_getNumHeapBytes (const HvMessage * m ) {
80- // get the size of all symbol elements
81- hv_size_t rsizeofsym = 0 ;
82- for (int i = 0 ; i < msg_getNumElements (m ); ++ i ) {
83- if (msg_isSymbol (m ,i )) {
84- rsizeofsym += (hv_size_t ) hv_strlen (msg_getSymbol (m ,i )) + 1 ; // +1 to allow for trailing '\0'
85- }
86- }
87-
88- // the total byte size on the heap
89- return (msg_getByteSize (msg_getNumElements (m )) + rsizeofsym );
90- }
91-
9259void msg_copyToBuffer (const HvMessage * m , char * buffer , hv_size_t len ) {
9360 HvMessage * r = (HvMessage * ) buffer ;
9461
62+ hv_size_t len_r = msg_getCoreSize (msg_getNumElements (m ));
63+
9564 // assert that the message is not already larger than the length of the buffer
96- hv_assert (msg_getNumBytes ( m ) <= len );
65+ hv_assert (len_r <= len );
9766
9867 // copy the basic message to the buffer
99- hv_memcpy (r , m , msg_getNumBytes ( m ) );
68+ hv_memcpy (r , m , len_r );
10069
101- hv_size_t len_r = msg_getNumBytes (m );
102-
103- char * p = buffer + msg_getByteSize (msg_getNumElements (m )); // points to the end of the base message
70+ char * p = buffer + len_r ; // points to the end of the base message
10471 for (int i = 0 ; i < msg_getNumElements (m ); ++ i ) {
10572 if (msg_isSymbol (m ,i )) {
10673 const hv_size_t symLen = (hv_size_t ) hv_strlen (msg_getSymbol (m ,i )) + 1 ; // include the trailing null char
@@ -117,7 +84,7 @@ void msg_copyToBuffer(const HvMessage *m, char *buffer, hv_size_t len) {
11784
11885// the message is serialised such that all symbol elements are placed in order at the end of the buffer
11986HvMessage * msg_copy (const HvMessage * m ) {
120- const hv_size_t heapSize = msg_getNumHeapBytes (m );
87+ const hv_uint32_t heapSize = msg_getSize (m );
12188 char * r = (char * ) hv_malloc (heapSize );
12289 hv_assert (r != NULL );
12390 msg_copyToBuffer (m , r , heapSize );
@@ -184,6 +151,7 @@ hv_uint32_t msg_symbolToHash(const char *s) {
184151 static const hv_int32_t r = 24 ;
185152
186153 if (s == NULL ) return 0 ;
154+
187155 hv_uint32_t len = (hv_uint32_t ) hv_strlen (s );
188156 hv_uint32_t x = len ; // seed (0) ^ len
189157
0 commit comments