summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntonio Cuni <anto.cuni@gmail.com>2013-10-18 17:33:54 +0200
committerAntonio Cuni <anto.cuni@gmail.com>2013-10-18 17:33:54 +0200
commit5467515065b95496b9f5b9d842ffc73c9ccb806e (patch)
tree27bfb8233e5b8aa63b76492337995578de9ab623
parentafa28fb2051cb00f03c83e020745e1eb238ff4ac (diff)
downloadmsgpack-python-5467515065b95496b9f5b9d842ffc73c9ccb806e.tar.gz
implement Packer.pack_extended_type also in the cython version of the code
-rw-r--r--msgpack/_packer.pyx6
-rw-r--r--msgpack/pack.h2
-rw-r--r--msgpack/pack_template.h60
-rw-r--r--test/test_extension.py2
4 files changed, 69 insertions, 1 deletions
diff --git a/msgpack/_packer.pyx b/msgpack/_packer.pyx
index 6289192..985559c 100644
--- a/msgpack/_packer.pyx
+++ b/msgpack/_packer.pyx
@@ -5,6 +5,7 @@ from cpython cimport *
from libc.stdlib cimport *
from libc.string cimport *
from libc.limits cimport *
+from libc.stdint cimport int8_t
from msgpack.exceptions import PackValueError
@@ -27,6 +28,7 @@ cdef extern from "pack.h":
int msgpack_pack_map(msgpack_packer* pk, size_t l)
int msgpack_pack_raw(msgpack_packer* pk, size_t l)
int msgpack_pack_raw_body(msgpack_packer* pk, char* body, size_t l)
+ int msgpack_pack_ext(msgpack_packer* pk, int8_t typecode, size_t l)
cdef int DEFAULT_RECURSE_LIMIT=511
@@ -193,6 +195,10 @@ cdef class Packer(object):
self.pk.length = 0
return buf
+ def pack_extended_type(self, typecode, data):
+ msgpack_pack_ext(&self.pk, typecode, len(data))
+ msgpack_pack_raw_body(&self.pk, data, len(data))
+
def pack_array_header(self, size_t size):
cdef int ret = msgpack_pack_array(&self.pk, size)
if ret == -1:
diff --git a/msgpack/pack.h b/msgpack/pack.h
index 1539991..08fdd82 100644
--- a/msgpack/pack.h
+++ b/msgpack/pack.h
@@ -70,6 +70,8 @@ static inline int msgpack_pack_map(msgpack_packer* pk, unsigned int n);
static inline int msgpack_pack_raw(msgpack_packer* pk, size_t l);
static inline int msgpack_pack_raw_body(msgpack_packer* pk, const void* b, size_t l);
+static inline int msgpack_pack_ext(msgpack_packer* pk, int8_t typecode, size_t l);
+
static inline int msgpack_pack_write(msgpack_packer* pk, const char *data, size_t l)
{
char* buf = pk->buf;
diff --git a/msgpack/pack_template.h b/msgpack/pack_template.h
index 9e00d7e..ac9815f 100644
--- a/msgpack/pack_template.h
+++ b/msgpack/pack_template.h
@@ -683,6 +683,66 @@ static inline int msgpack_pack_raw_body(msgpack_packer* x, const void* b, size_t
msgpack_pack_append_buffer(x, (const unsigned char*)b, l);
}
+/*
+ * Ext
+ */
+
+static inline int msgpack_pack_ext(msgpack_packer* x, int8_t typecode, size_t l)
+{
+ if (l == 1) {
+ unsigned char buf[2];
+ buf[0] = 0xd4;
+ buf[1] = (unsigned char)typecode;
+ msgpack_pack_append_buffer(x, buf, 2);
+ }
+ else if(l == 2) {
+ unsigned char buf[2];
+ buf[0] = 0xd5;
+ buf[1] = (unsigned char)typecode;
+ msgpack_pack_append_buffer(x, buf, 2);
+ }
+ else if(l == 4) {
+ unsigned char buf[2];
+ buf[0] = 0xd6;
+ buf[1] = (unsigned char)typecode;
+ msgpack_pack_append_buffer(x, buf, 2);
+ }
+ else if(l == 8) {
+ unsigned char buf[2];
+ buf[0] = 0xd7;
+ buf[1] = (unsigned char)typecode;
+ msgpack_pack_append_buffer(x, buf, 2);
+ }
+ else if(l == 16) {
+ unsigned char buf[2];
+ buf[0] = 0xd8;
+ buf[1] = (unsigned char)typecode;
+ msgpack_pack_append_buffer(x, buf, 2);
+ }
+ else if(l < 256) {
+ unsigned char buf[3];
+ buf[0] = 0xc7;
+ buf[1] = l;
+ buf[2] = (unsigned char)typecode;
+ msgpack_pack_append_buffer(x, buf, 3);
+ } else if(l < 65536) {
+ unsigned char buf[4];
+ buf[0] = 0xc8;
+ _msgpack_store16(&buf[1], (uint16_t)l);
+ buf[3] = (unsigned char)typecode;
+ msgpack_pack_append_buffer(x, buf, 4);
+ } else {
+ unsigned char buf[6];
+ buf[0] = 0xc9;
+ _msgpack_store32(&buf[1], (uint32_t)l);
+ buf[5] = (unsigned char)typecode;
+ msgpack_pack_append_buffer(x, buf, 6);
+ }
+
+}
+
+
+
#undef msgpack_pack_append_buffer
#undef TAKE8_8
diff --git a/test/test_extension.py b/test/test_extension.py
index 1908fa2..9ec1153 100644
--- a/test/test_extension.py
+++ b/test/test_extension.py
@@ -6,7 +6,7 @@ def test_pack_extended_type():
def p(s):
packer = msgpack.Packer()
packer.pack_extended_type(0x42, s)
- return packer._buffer.getvalue()
+ return packer.bytes()
assert p('A') == '\xd4\x42A' # fixext 1
assert p('AB') == '\xd5\x42AB' # fixext 2
assert p('ABCD') == '\xd6\x42ABCD' # fixext 4