diff options
| author | Garrett D'Amore <garrett@damore.org> | 2018-08-31 11:25:50 -0700 |
|---|---|---|
| committer | Garrett D'Amore <garrett@damore.org> | 2018-08-31 11:25:50 -0700 |
| commit | 49c8c264057c4c7b0f9ff45f352168cb1deeb1a1 (patch) | |
| tree | 30836d3dfe020380216113784b4ab74c633d9b45 /src/core/message.c | |
| parent | 2426984f20a8363e52fef5cd69221da05c0b1756 (diff) | |
| download | nng-49c8c264057c4c7b0f9ff45f352168cb1deeb1a1.tar.gz nng-49c8c264057c4c7b0f9ff45f352168cb1deeb1a1.tar.bz2 nng-49c8c264057c4c7b0f9ff45f352168cb1deeb1a1.zip | |
fixes #691 Desire 16 and 64 bit message manipulators
We use macros to generate message bodies for each of the various
variants, reducing source code size (but not compiled size). The
documentation is updated to indicate each of these variants.
Diffstat (limited to 'src/core/message.c')
| -rw-r--r-- | src/core/message.c | 152 |
1 files changed, 106 insertions, 46 deletions
diff --git a/src/core/message.c b/src/core/message.c index f17240a4..f3151230 100644 --- a/src/core/message.c +++ b/src/core/message.c @@ -286,6 +286,42 @@ nni_chunk_insert(nni_chunk *ch, const void *data, size_t len) } static int +nni_chunk_insert_u16(nni_chunk *ch, uint16_t val) +{ + unsigned char buf[sizeof(uint16_t)]; + NNI_PUT16(buf, val); + return (nni_chunk_insert(ch, buf, sizeof(buf))); +} + +static int +nni_chunk_append_u16(nni_chunk *ch, uint16_t val) +{ + unsigned char buf[sizeof(uint16_t)]; + NNI_PUT16(buf, val); + return (nni_chunk_append(ch, buf, sizeof(buf))); +} + +static uint16_t +nni_chunk_trim_u16(nni_chunk *ch) +{ + uint16_t v; + NNI_ASSERT(ch->ch_len >= sizeof(v)); + NNI_GET16(ch->ch_ptr, v); + nni_chunk_trim(ch, sizeof(v)); + return (v); +} + +static uint16_t +nni_chunk_chop_u16(nni_chunk *ch) +{ + uint16_t v; + NNI_ASSERT(ch->ch_len >= sizeof(v)); + NNI_GET16(ch->ch_ptr + ch->ch_len - sizeof(v), v); + nni_chunk_chop(ch, sizeof(v)); + return (v); +} + +static int nni_chunk_insert_u32(nni_chunk *ch, uint32_t val) { unsigned char buf[sizeof(uint32_t)]; @@ -321,6 +357,42 @@ nni_chunk_chop_u32(nni_chunk *ch) return (v); } +static int +nni_chunk_insert_u64(nni_chunk *ch, uint64_t val) +{ + unsigned char buf[sizeof(uint64_t)]; + NNI_PUT64(buf, val); + return (nni_chunk_insert(ch, buf, sizeof(buf))); +} + +static int +nni_chunk_append_u64(nni_chunk *ch, uint64_t val) +{ + unsigned char buf[sizeof(uint64_t)]; + NNI_PUT64(buf, val); + return (nni_chunk_append(ch, buf, sizeof(buf))); +} + +static uint64_t +nni_chunk_trim_u64(nni_chunk *ch) +{ + uint64_t v; + NNI_ASSERT(ch->ch_len >= sizeof(v)); + NNI_GET64(ch->ch_ptr, v); + nni_chunk_trim(ch, sizeof(v)); + return (v); +} + +static uint64_t +nni_chunk_chop_u64(nni_chunk *ch) +{ + uint64_t v; + NNI_ASSERT(ch->ch_len >= sizeof(v)); + NNI_GET64(ch->ch_ptr + ch->ch_len - sizeof(v), v); + nni_chunk_chop(ch, sizeof(v)); + return (v); +} + int nni_msg_alloc(nni_msg **mp, size_t sz) { @@ -558,52 +630,40 @@ nni_msg_header_chop(nni_msg *m, size_t len) return (nni_chunk_chop(&m->m_header, len)); } -int -nni_msg_append_u32(nni_msg *m, uint32_t val) -{ - return (nni_chunk_append_u32(&m->m_body, val)); -} - -int -nni_msg_insert_u32(nni_msg *m, uint32_t val) -{ - return (nni_chunk_insert_u32(&m->m_body, val)); -} - -int -nni_msg_header_append_u32(nni_msg *m, uint32_t val) -{ - return (nni_chunk_append_u32(&m->m_header, val)); -} - -int -nni_msg_header_insert_u32(nni_msg *m, uint32_t val) -{ - return (nni_chunk_insert_u32(&m->m_header, val)); -} - -uint32_t -nni_msg_chop_u32(nni_msg *m) -{ - return (nni_chunk_chop_u32(&m->m_body)); -} - -uint32_t -nni_msg_trim_u32(nni_msg *m) -{ - return (nni_chunk_trim_u32(&m->m_body)); -} - -uint32_t -nni_msg_header_chop_u32(nni_msg *m) -{ - return (nni_chunk_chop_u32(&m->m_header)); -} -uint32_t -nni_msg_header_trim_u32(nni_msg *m) -{ - return (nni_chunk_trim_u32(&m->m_header)); -} +#define DEF_MSG_ADD_N(z, x) \ + int nni_msg_##z##_u##x(nni_msg *m, uint##x##_t v) \ + { \ + return (nni_chunk_##z##_u##x(&m->m_body, v)); \ + } \ + int nni_msg_header_##z##_u##x(nni_msg *m, uint##x##_t v) \ + { \ + return (nni_chunk_##z##_u##x(&m->m_header, v)); \ + } + +#define DEF_MSG_REM_N(z, x) \ + uint##x##_t nni_msg_##z##_u##x(nni_msg *m) \ + { \ + return (nni_chunk_##z##_u##x(&m->m_body)); \ + } \ + uint##x##_t nni_msg_header_##z##_u##x(nni_msg *m) \ + { \ + return (nni_chunk_##z##_u##x(&m->m_header)); \ + } + +#define DEF_MSG_ADD(op) \ + DEF_MSG_ADD_N(op, 16) DEF_MSG_ADD_N(op, 32) DEF_MSG_ADD_N(op, 64) +#define DEF_MSG_REM(op) \ + DEF_MSG_REM_N(op, 16) DEF_MSG_REM_N(op, 32) DEF_MSG_REM_N(op, 64) + +DEF_MSG_ADD(append) +DEF_MSG_ADD(insert) +DEF_MSG_REM(chop) +DEF_MSG_REM(trim) + +#undef DEF_MSG_ADD_N +#undef DEF_MSG_REM_N +#undef DEF_MSG_ADD +#undef DEF_MSG_REM void nni_msg_clear(nni_msg *m) |
