summaryrefslogtreecommitdiff
path: root/c/object.c
diff options
context:
space:
mode:
authorfrsyuki <frsyuki@vcore.(none)>2009-02-24 16:37:47 +0900
committerfrsyuki <frsyuki@vcore.(none)>2009-02-24 16:37:47 +0900
commitbdd13859b60d06ec6fabdbaccea81cbee189b8bc (patch)
treec76ff69b75cd98c669ead4c25ca1d3fd33b0666a /c/object.c
parentaaaaecb8bad862afc66ad5a2772adb78b9082df8 (diff)
downloadmsgpack-python-bdd13859b60d06ec6fabdbaccea81cbee189b8bc.tar.gz
c: msgpack_pack_object
Diffstat (limited to 'c/object.c')
-rw-r--r--c/object.c69
1 files changed, 69 insertions, 0 deletions
diff --git a/c/object.c b/c/object.c
index 871153d..bcb2537 100644
--- a/c/object.c
+++ b/c/object.c
@@ -16,9 +16,78 @@
* limitations under the License.
*/
#include "msgpack/object.h"
+#include "msgpack/pack.h"
#include <stdio.h>
#include <inttypes.h>
+
+int msgpack_pack_object(msgpack_packer* pk, msgpack_object d)
+{
+ switch(d.type) {
+ case MSGPACK_OBJECT_NIL:
+ return msgpack_pack_nil(pk);
+
+ case MSGPACK_OBJECT_BOOLEAN:
+ if(d.via.boolean) {
+ return msgpack_pack_true(pk);
+ } else {
+ return msgpack_pack_false(pk);
+ }
+
+ case MSGPACK_OBJECT_POSITIVE_INTEGER:
+ return msgpack_pack_uint64(pk, d.via.u64);
+
+ case MSGPACK_OBJECT_NEGATIVE_INTEGER:
+ return msgpack_pack_int64(pk, d.via.i64);
+
+ case MSGPACK_OBJECT_DOUBLE:
+ return msgpack_pack_double(pk, d.via.dec);
+
+ case MSGPACK_OBJECT_RAW:
+ {
+ int ret = msgpack_pack_raw(pk, d.via.raw.size);
+ if(ret < 0) { return ret; }
+ return msgpack_pack_raw_body(pk, d.via.raw.ptr, d.via.raw.size);
+ }
+
+ case MSGPACK_OBJECT_ARRAY:
+ {
+ int ret = msgpack_pack_array(pk, d.via.array.size);
+ if(ret < 0) { return ret; }
+
+ msgpack_object* o = d.via.array.ptr;
+ msgpack_object* const oend = d.via.array.ptr + d.via.array.size;
+ for(; o != oend; ++o) {
+ ret = msgpack_pack_object(pk, *o);
+ if(ret < 0) { return ret; }
+ }
+
+ return 0;
+ }
+
+ case MSGPACK_OBJECT_MAP:
+ {
+ int ret = msgpack_pack_map(pk, d.via.map.size);
+ if(ret < 0) { return ret; }
+
+ msgpack_object_kv* kv = d.via.map.ptr;
+ msgpack_object_kv* const kvend = d.via.map.ptr + d.via.map.size;
+ for(; kv != kvend; ++kv) {
+ ret = msgpack_pack_object(pk, kv->key);
+ if(ret < 0) { return ret; }
+ ret = msgpack_pack_object(pk, kv->val);
+ if(ret < 0) { return ret; }
+ }
+
+ return 0;
+ }
+
+ default:
+ return -1;
+ }
+}
+
+
void msgpack_object_print(FILE* out, msgpack_object o)
{
switch(o.type) {