## libmpack

[![Travis Build Status](https://travis-ci.org/libmpack/libmpack.svg?branch=master)](https://travis-ci.org/libmpack/libmpack)
[![Coverage Status](https://coveralls.io/repos/libmpack/libmpack/badge.svg?branch=master&service=github)](https://coveralls.io/github/libmpack/libmpack?branch=master)

### Introduction

libmpack is a small binary serialization/RPC library that implements both the
[msgpack](https://github.com/msgpack/msgpack/blob/master/spec.md) and
[msgpack-rpc](https://github.com/msgpack-rpc/msgpack-rpc/blob/master/spec.md)
specifications.

### Rationale

While there's already a [msgpack-c](https://github.com/msgpack/msgpack-c)
implementation, it has a few problems that libmpack aims to address:

* It couples msgpack serialization format with a set of predefined C typedefs.
  This means the user almost always has to recursively convert the allocated
  structures into some other application-specific format, especially if binding
  to another language. libmpack serialization/deserialization API is
  callback-based, making it simple to serialize/deserialize directly from/to
  application-specific objects.

* It is not trivial to simply include its files into another project(eg: a lua C
  module) since it relies too much on C99 features and compilation with
  -Wconversion issues a bunch of warnings. You need to build the library and
  link against it, which can be cumbersome for a simple serialization library
  that is being embedded into other projects(lua or node.js modules for
  example). libmpack provides an amalgamation build(single source file
  containing all code that can be #included) and should compile cleanly as part
  of any C89 project. It won't produce any warnings for
  `-Wall`/`-Wextra`/`-Wconversion`.

* msgpack-c doesn't work without allocating memory. For example, you can't
  send/receive simple primitives without a `msgpack_sbuffer_t`(which is then
  dynamically extended by msgpack internal functions). libmpack does no
  allocation at all, and provides some helpers to simplify dynamic allocation by
  the user, if required.

* There's no msgpack-rpc implementation for C(much less one that can be reused
  in other languages). libmpack has a simple and flexible msgpack-rpc
  implementation that can be used to easily create distributed applications
  across any kind of transport. Unlike some msgpack-rpc libraries(ruby official
  implementation for example), libmpack has no coupling with any network
  sink/source, allowing it to be used with any event loop library or
  system-specific networking APIs.

Here's a few extras that may or not overlap with what msgpack-c provides:

* Fully incremental/iterative parse/serialization API with no backtracking,
  which simplifies working with split buffers.

* Portable C89 library with zero system dependencies. In fact, it only uses one
  function from C standard library: memcpy. libmpack can be used even in
  OS/kernel development(eg: communicate with userspace using
  netlink/msgpack-rpc).

* Endian aware: it should work unmodified regardless of the system's byte order,
  and its CI infrastructure automatically tests it on a big endian platform.

* Well tested, it should always have about 100% code coverage:
  https://coveralls.io/github/libmpack/libmpack?branch=master

* Relatively small footprint: The amalgamation(headers + code) is less than 2k
  lines of C. The whole library can be inlined when compiled with -O3(Though
  this depends on compiler and usage, eg: how many call sites for certain
  functions).
