msgpuck.h(3) | Library Functions Manual | msgpuck.h(3) |
msgpuck.h - MsgPuck is a simple and efficient MsgPack encoder/decoder library in a single self-contained file.
#include <stdlib.h>
#include <stdint.h>
#include <stddef.h>
#include <stdbool.h>
#include <string.h>
#include <assert.h>
#include <stdarg.h>
#include <stdio.h>
enum mp_type { MP_NIL = 0, MP_UINT,
MP_INT, MP_STR, MP_BIN, MP_ARRAY, MP_MAP,
MP_BOOL, MP_FLOAT, MP_DOUBLE, MP_EXT } MsgPack
data types. "
MP_PROTO enum mp_type mp_typeof (const char c)
Determine MsgPack type by a first byte c of encoded data. MP_PROTO
uint32_t mp_sizeof_array (uint32_t size)
Calculate exact buffer size needed to store an array header of size
elements. Maximum return value is 5. For performance reasons you can
preallocate buffer for maximum size without calling the function. MP_PROTO
char * mp_encode_array (char *data, uint32_t size)
Encode an array header of size elements. MP_PROTO ptrdiff_t
mp_check_array (const char *cur, const char *end)
Check that cur buffer has enough bytes to decode an array header.
MP_PROTO uint32_t mp_decode_array (const char **data)
Decode an array header from MsgPack data. MP_PROTO uint32_t
mp_sizeof_map (uint32_t size)
Calculate exact buffer size needed to store a map header of size
elements. Maximum return value is 5. For performance reasons you can
preallocate buffer for maximum size without calling the function. MP_PROTO
char * mp_encode_map (char *data, uint32_t size)
Encode a map header of size elements. MP_PROTO ptrdiff_t
mp_check_map (const char *cur, const char *end)
Check that cur buffer has enough bytes to decode a map header. MP_PROTO
uint32_t mp_decode_map (const char **data)
Decode a map header from MsgPack data. MP_PROTO uint32_t
mp_sizeof_uint (uint64_t num)
Calculate exact buffer size needed to store an integer num. Maximum
return value is 9. For performance reasons you can preallocate buffer for
maximum size without calling the function. Example usage: MP_PROTO uint32_t
mp_sizeof_int (int64_t num)
Calculate exact buffer size needed to store an integer num. Maximum
return value is 9. For performance reasons you can preallocate buffer for
maximum size without calling the function. MP_PROTO char *
mp_encode_uint (char *data, uint64_t num)
Encode an unsigned integer num. It is your responsibility to ensure
that data has enough space. MP_PROTO char * mp_encode_int
(char *data, int64_t num)
Encode a signed integer num. It is your responsibility to ensure that
data has enough space. MP_PROTO ptrdiff_t mp_check_uint (const
char *cur, const char *end)
Check that cur buffer has enough bytes to decode an uint. MP_PROTO
ptrdiff_t mp_check_int (const char *cur, const char *end)
Check that cur buffer has enough bytes to decode an int. MP_PROTO
uint64_t mp_decode_uint (const char **data)
Decode an unsigned integer from MsgPack data. MP_PROTO int64_t
mp_decode_int (const char **data)
Decode a signed integer from MsgPack data. MP_PROTO int
mp_compare_uint (const char *data_a, const char *data_b)
Compare two packed unsigned integers. MP_PROTO uint32_t mp_sizeof_float
(float num)
Calculate exact buffer size needed to store a float num. The return
value is always 5. The function was added to provide integrity of the
library. MP_PROTO uint32_t mp_sizeof_double (double num)
Calculate exact buffer size needed to store a double num. The return
value is either 5 or 9. The function was added to provide integrity of the
library. For performance reasons you can preallocate buffer for maximum size
without calling the function. MP_PROTO char * mp_encode_float (char
*data, float num)
Encode a float num. It is your responsibility to ensure that
data has enough space. MP_PROTO char * mp_encode_double (char
*data, double num)
Encode a double num. It is your responsibility to ensure that
data has enough space. MP_PROTO ptrdiff_t mp_check_float
(const char *cur, const char *end)
Check that cur buffer has enough bytes to decode a float. MP_PROTO
ptrdiff_t mp_check_double (const char *cur, const char *end)
Check that cur buffer has enough bytes to decode a double. MP_PROTO
float mp_decode_float (const char **data)
Decode a float from MsgPack data. MP_PROTO double
mp_decode_double (const char **data)
Decode a double from MsgPack data. MP_PROTO uint32_t
mp_sizeof_strl (uint32_t len)
Calculate exact buffer size needed to store a string header of length
num. Maximum return value is 5. For performance reasons you can
preallocate buffer for maximum size without calling the function. MP_PROTO
uint32_t mp_sizeof_str (uint32_t len)
Equivalent to mp_sizeof_strl(len) + len. MP_PROTO uint32_t
mp_sizeof_binl (uint32_t len)
Calculate exact buffer size needed to store a binstring header of length
num. Maximum return value is 5. For performance reasons you can
preallocate buffer for maximum size without calling the function. MP_PROTO
uint32_t mp_sizeof_bin (uint32_t len)
Equivalent to mp_sizeof_binl(len) + len. MP_PROTO char *
mp_encode_strl (char *data, uint32_t len)
Encode a string header of length len. MP_PROTO char *
mp_encode_str (char *data, const char *str, uint32_t len)
Encode a string of length len. The function is equivalent to
mp_encode_strl() + memcpy. MP_PROTO char * mp_encode_binl
(char *data, uint32_t len)
Encode a binstring header of length len. See mp_encode_strl()
for more details. MP_PROTO char * mp_encode_bin (char *data, const
char *str, uint32_t len)
Encode a binstring of length len. The function is equivalent to
mp_encode_binl() + memcpy. MP_PROTO size_t mp_format (char
*data, size_t data_size, const char *format,...)
Encode a sequence of values according to format string. Example:
mp_format(buf, sz, '[%d {%d%s%d%s}]', 42, 0, 'false', 1, 'true'); to get a
msgpack array of two items: number 42 and map (0->'false,
2->'true)Doesnotwriteitemsthatdon'tfittodata_sizeargument.
MP_PROTO size_t mp_vformat (char *data, size_t data_size, const char
*format, va_list args)
mp_format variation, taking variable argument list Example: va_list args;
va_start(args, fmt); mp_vformat(data, data_size, fmt, args); va_end(args);
MP_PROTO int mp_fprint (FILE *file, const char *data)
print to file msgpacked data in JSON format. MP_EXT is printed as 'EXT'
only MP_PROTO ptrdiff_t mp_check_strl (const char *cur, const char
*end)
Check that cur buffer has enough bytes to decode a string header.
MP_PROTO ptrdiff_t mp_check_binl (const char *cur, const char *end)
Check that cur buffer has enough bytes to decode a binstring header.
MP_PROTO uint32_t mp_decode_strl (const char **data)
Decode a length of a string from MsgPack data. MP_PROTO const char *
mp_decode_str (const char **data, uint32_t *len)
Decode a string from MsgPack data. MP_PROTO uint32_t
mp_decode_binl (const char **data)
Decode a length of a binstring from MsgPack data. MP_PROTO const char *
mp_decode_bin (const char **data, uint32_t *len)
Decode a binstring from MsgPack data. MP_PROTO uint32_t
mp_decode_strbinl (const char **data)
Decode a length of a string or binstring from MsgPack data. MP_PROTO
const char * mp_decode_strbin (const char **data, uint32_t *len)
Decode a string or binstring from MsgPack data. MP_PROTO uint32_t
mp_sizeof_nil (void)
Calculate exact buffer size needed to store the nil value. The return value is
always 1. The function was added to provide integrity of the library.
MP_PROTO char * mp_encode_nil (char *data)
Encode the nil value. It is your responsibility to ensure that data has
enough space. MP_PROTO ptrdiff_t mp_check_nil (const char *cur, const
char *end)
Check that cur buffer has enough bytes to decode nil. MP_PROTO void
mp_decode_nil (const char **data)
Decode the nil value from MsgPack data. MP_PROTO uint32_t
mp_sizeof_bool (bool val)
Calculate exact buffer size needed to store a boolean value. The return value
is always 1. The function was added to provide integrity of the library.
MP_PROTO char * mp_encode_bool (char *data, bool val)
Encode a bool value val. It is your responsibility to ensure that
data has enough space. MP_PROTO ptrdiff_t mp_check_bool (const
char *cur, const char *end)
Check that cur buffer has enough bytes to decode a bool value. MP_PROTO
bool mp_decode_bool (const char **data)
Decode a bool value from MsgPack data. MP_PROTO void mp_next
(const char **data)
Skip one element in a packed data. MP_PROTO int mp_check (const
char **data, const char *end)
Equivalent to mp_next() but also validates MsgPack in data.
MsgPuck is a simple and efficient MsgPack encoder/decoder library in a single self-contained file.
MsgPuck Usage example:
// Encode char buf[1024]; char *w = buf; w = mp_encode_array(w, 4) w = mp_encode_uint(w, 10); w = mp_encode_str(w, "hello world", strlen("hello world")); w = mp_encode_bool(w, true); w = mp_encode_double(w, 3.1415); // Validate const char *b = buf; int r = mp_check(&b, w); assert(!r) assert(b == w); // Decode uint32_t size; uint64_t ival; const char *sval; uint32_t sval_len; bool bval; double dval; const char *r = buf; size = mp_decode_array(&r); // size is 4 ival = mp_decode_uint(&r); // ival is 10; sval = mp_decode_str(&r, &sval_len); // sval is "hello world", sval_len is strlen("hello world") bval = mp_decode_bool(&r); // bval is true dval = mp_decode_double(&r); // dval is 3.1415 assert(r == w);
Note:
Inline functions. The implementation is compatible with both C99 and GNU inline functions. Please define MP_SOURCE 1 before #include <msgpuck.h> in a single compilation unit. This module will be used to store non-inlined versions of functions and global tables.
Equivalent to mp_next() but also validates MsgPack in data.
Parameters:
Return values:
Postcondition:
*data is not defined if MsgPack is not valid
See also:
Check that cur buffer has enough bytes to decode an array header.
Parameters:
Return values:
Precondition:
mp_typeof(*cur) == MP_ARRAY
Check that cur buffer has enough bytes to decode a binstring header.
Parameters:
Return values:
Precondition:
mp_typeof(*cur) == MP_BIN
Check that cur buffer has enough bytes to decode a bool value.
Parameters:
Return values:
Precondition:
mp_typeof(*cur) == MP_BOOL
Check that cur buffer has enough bytes to decode a double.
Parameters:
Return values:
Precondition:
mp_typeof(*cur) == MP_DOUBLE
Check that cur buffer has enough bytes to decode a float.
Parameters:
Return values:
Precondition:
mp_typeof(*cur) == MP_FLOAT
Check that cur buffer has enough bytes to decode an int.
Parameters:
Return values:
Precondition:
mp_typeof(*cur) == MP_INT
Check that cur buffer has enough bytes to decode a map header.
Parameters:
Return values:
Precondition:
mp_typeof(*cur) == MP_MAP
Check that cur buffer has enough bytes to decode nil.
Parameters:
Return values:
Precondition:
mp_typeof(*cur) == MP_NIL
Check that cur buffer has enough bytes to decode a string header.
Parameters:
Return values:
Precondition:
mp_typeof(*cur) == MP_STR
Check that cur buffer has enough bytes to decode an uint.
Parameters:
Return values:
Precondition:
mp_typeof(*cur) == MP_UINT
Compare two packed unsigned integers. The function is faster than two mp_decode_uint() calls.
Parameters:
Return values:
Decode an array header from MsgPack data. All array members must be decoded after the header.
Parameters:
Returns:
Postcondition:
See also:
Decode a binstring from MsgPack data.
Parameters:
Returns:
Postcondition:
See also:
Decode a length of a binstring from MsgPack data.
Parameters:
Returns:
Postcondition:
See also:
Decode a bool value from MsgPack data.
Parameters:
Returns:
Postcondition:
Decode a double from MsgPack data.
Parameters:
Returns:
Postcondition:
Decode a float from MsgPack data.
Parameters:
Returns:
Postcondition:
Decode a signed integer from MsgPack data.
Parameters:
Returns:
Postcondition:
Decode a map header from MsgPack data. All map key-value pairs must be decoded after the header.
Parameters:
Returns:
Postcondition:
See also:
Decode the nil value from MsgPack data.
Parameters:
Postcondition:
Decode a string from MsgPack data.
Parameters:
Returns:
Postcondition:
See also:
Decode a string or binstring from MsgPack data.
Parameters:
Returns:
Postcondition:
See also:
Decode a length of a string or binstring from MsgPack data.
Parameters:
Returns:
Postcondition:
See also:
Decode a length of a string from MsgPack data.
Parameters:
Returns:
Postcondition:
See also:
Decode an unsigned integer from MsgPack data.
Parameters:
Returns:
Postcondition:
Encode an array header of size elements. All array members must be encoded after the header.
Example usage:
// Encode char buf[1024]; char *w = buf; w = mp_encode_array(w, 2) w = mp_encode_uint(w, 10); w = mp_encode_uint(w, 15); // Decode const char *r = buf; uint32_t size = mp_decode_array(&r); for (uint32_t i = 0; i < size; i++) { uint64_t val = mp_decode_uint(&r); } assert (r == w);
It is your responsibility to ensure that data has enough space.
Parameters:
Returns:
See also:
Encode a binstring of length len. The function is equivalent to mp_encode_binl() + memcpy.
Parameters:
Returns:
See also:
Encode a binstring header of length len. See mp_encode_strl() for more details.
Parameters:
Returns:
See also:
Encode a bool value val. It is your responsibility to ensure that data has enough space.
Parameters:
Returns:
See also:
mp_sizeof_bool()
Encode a double num. It is your responsibility to ensure that data has enough space.
Parameters:
Returns:
See also:
mp_sizeof_double()
Encode a float num. It is your responsibility to ensure that data has enough space.
Parameters:
Returns:
See also:
An usage example
Encode a signed integer num. It is your responsibility to ensure that data has enough space.
Parameters:
Returns:
See also:
mp_sizeof_int()
Precondition:
Encode a map header of size elements. All map key-value pairs must be encoded after the header.
Example usage:
char buf[1024]; // Encode char *w = buf; w = mp_encode_map(b, 2); w = mp_encode_str(b, "key1", 4); w = mp_encode_str(b, "value1", 6); w = mp_encode_str(b, "key2", 4); w = mp_encode_str(b, "value2", 6); // Decode const char *r = buf; uint32_t size = mp_decode_map(&r); for (uint32_t i = 0; i < size; i++) { // Use switch(mp_typeof(**r)) to support more types uint32_t key_len, val_len; const char *key = mp_decode_str(&r, key_len); const char *val = mp_decode_str(&r, val_len); } assert (r == w);
It is your responsibility to ensure that data has enough space.
Parameters:
Returns:
See also:
Encode the nil value. It is your responsibility to ensure that data has enough space.
Parameters:
Returns:
See also:
mp_sizeof_nil()
Encode a string of length len. The function is equivalent to mp_encode_strl() + memcpy.
Parameters:
Returns:
See also:
Encode a string header of length len. The function encodes MsgPack header (only header) for a string of length len. You should append actual string data to the buffer manually after encoding the header (exactly len bytes without trailing '\0').
This approach is very useful for cases when the total length of the string is known in advance, but the string data is not stored in a single continuous buffer (e.g. network packets).
It is your responsibility to ensure that data has enough space. Usage example:
char buffer[1024]; char *b = buffer; b = mp_encode_strl(b, hdr.total_len); char *s = b; memcpy(b, pkt1.data, pkt1.len) b += pkt1.len; // get next packet memcpy(b, pkt2.data, pkt2.len) b += pkt2.len; // get next packet memcpy(b, pkt1.data, pkt3.len) b += pkt3.len; // Check that all data was received assert(hdr.total_len == (uint32_t) (b - s))
Hint: you can dynamically reallocate the buffer during the process.
Parameters:
Returns:
See also:
Encode an unsigned integer num. It is your responsibility to ensure that data has enough space.
Parameters:
Returns:
See also:
mp_sizeof_uint()
Encode a sequence of values according to format string. Example: mp_format(buf, sz, '[%d {%d%s%d%s}]', 42, 0, 'false', 1, 'true'); to get a msgpack array of two items: number 42 and map (0->'false, 2->'true") Does not write items that don't fit to data_size argument.
Parameters:
Returns:
Return values:
print to file msgpacked data in JSON format. MP_EXT is printed as 'EXT' only
Parameters:
Return values:
Skip one element in a packed data. The function is faster than mp_typeof + mp_decode_XXX() combination. For arrays and maps the function also skips all members. For strings and binstrings the function also skips the string data.
Usage example:
char buf[1024]; char *w = buf; // First MsgPack object w = mp_encode_uint(w, 10); // Second MsgPack object w = mp_encode_array(w, 4); w = mp_encode_array(w, 2); // Begin of an inner array w = mp_encode_str(w, "second inner 1", 14); w = mp_encode_str(w, "second inner 2", 14); // End of an inner array w = mp_encode_str(w, "second", 6); w = mp_encode_uint(w, 20); w = mp_encode_bool(w, true); // Third MsgPack object w = mp_encode_str(w, "third", 5); // EOF const char *r = buf; // First MsgPack object assert(mp_typeof(**r) == MP_UINT); mp_next(&r); // skip the first object // Second MsgPack object assert(mp_typeof(**r) == MP_ARRAY); mp_decode_array(&r); assert(mp_typeof(**r) == MP_ARRAY); // inner array mp_next(&r); // -->> skip the entire inner array (with all members) assert(mp_typeof(**r) == MP_STR); // second mp_next(&r); assert(mp_typeof(**r) == MP_UINT); // 20 mp_next(&r); assert(mp_typeof(**r) == MP_BOOL); // true mp_next(&r); // Third MsgPack object assert(mp_typeof(**r) == MP_STR); // third mp_next(&r); assert(r == w); // EOF
Parameters:
Postcondition:
Calculate exact buffer size needed to store an array header of size elements. Maximum return value is 5. For performance reasons you can preallocate buffer for maximum size without calling the function.
Parameters:
Returns:
Equivalent to mp_sizeof_binl(len) + len.
Parameters:
Returns:
Calculate exact buffer size needed to store a binstring header of length num. Maximum return value is 5. For performance reasons you can preallocate buffer for maximum size without calling the function.
Parameters:
Returns:
Calculate exact buffer size needed to store a boolean value. The return value is always 1. The function was added to provide integrity of the library.
Returns:
Calculate exact buffer size needed to store a double num. The return value is either 5 or 9. The function was added to provide integrity of the library. For performance reasons you can preallocate buffer for maximum size without calling the function.
Parameters:
Returns:
Calculate exact buffer size needed to store a float num. The return value is always 5. The function was added to provide integrity of the library.
Parameters:
Returns:
Calculate exact buffer size needed to store an integer num. Maximum return value is 9. For performance reasons you can preallocate buffer for maximum size without calling the function.
Parameters:
Returns:
Precondition:
Calculate exact buffer size needed to store a map header of size elements. Maximum return value is 5. For performance reasons you can preallocate buffer for maximum size without calling the function.
Parameters:
Returns:
Calculate exact buffer size needed to store the nil value. The return value is always 1. The function was added to provide integrity of the library.
Returns:
Equivalent to mp_sizeof_strl(len) + len.
Parameters:
Returns:
Calculate exact buffer size needed to store a string header of length num. Maximum return value is 5. For performance reasons you can preallocate buffer for maximum size without calling the function.
Parameters:
Returns:
Calculate exact buffer size needed to store an integer num. Maximum return value is 9. For performance reasons you can preallocate buffer for maximum size without calling the function. Example usage:
char **data = ...; char *end = *data; my_buffer_ensure(mp_sizeof_uint(x), &end); // my_buffer_ensure(9, &end); mp_encode_uint(buffer, x);
Parameters:
Returns:
Determine MsgPack type by a first byte c of encoded data. Example usage:
assert(MP_ARRAY == mp_typeof(0x90));
Parameters:
Returns:
mp_format variation, taking variable argument list Example: va_list args; va_start(args, fmt); mp_vformat(data, data_size, fmt, args); va_end(args);
See also:
Generated automatically by Doxygen for MsgPuck from the source code.
Sun Jun 4 2017 | MsgPuck |