summaryrefslogtreecommitdiff
path: root/unpack.h
diff options
context:
space:
mode:
Diffstat (limited to 'unpack.h')
-rw-r--r--unpack.h273
1 files changed, 3 insertions, 270 deletions
diff --git a/unpack.h b/unpack.h
index d578360..eb72001 100644
--- a/unpack.h
+++ b/unpack.h
@@ -15,12 +15,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-#include "msgpack/unpack.h"
#include "msgpack/unpack_define.h"
-#include <stdlib.h>
-
-#include "Python.h"
-
typedef struct {
int reserved;
@@ -44,11 +39,11 @@ typedef struct {
struct template_context;
typedef struct template_context template_context;
-static void template_init(template_context* ctx);
+static inline void template_init(template_context* ctx);
-static msgpack_unpack_object template_data(template_context* ctx);
+static inline msgpack_unpack_object template_data(template_context* ctx);
-static int template_execute(template_context* ctx,
+static inline int template_execute(template_context* ctx,
const char* data, size_t len, size_t* off);
@@ -133,265 +128,3 @@ static inline int template_callback_raw(unpack_user* u, const char* b, const cha
}
#include "msgpack/unpack_template.h"
-
-
-#if 0
-#define CTX_CAST(m) ((template_context*)(m))
-#define CTX_REFERENCED(mpac) CTX_CAST((mpac)->ctx)->user.referenced
-
-
-static const size_t COUNTER_SIZE = sizeof(unsigned int);
-
-static inline void init_count(void* buffer)
-{
- *(volatile unsigned int*)buffer = 1;
-}
-
-static inline void decl_count(void* buffer)
-{
- //if(--*(unsigned int*)buffer == 0) {
- if(__sync_sub_and_fetch((unsigned int*)buffer, 1) == 0) {
- free(buffer);
- }
-}
-
-static inline void incr_count(void* buffer)
-{
- //++*(unsigned int*)buffer;
- __sync_add_and_fetch((unsigned int*)buffer, 1);
-}
-
-static inline unsigned int get_count(void* buffer)
-{
- return *(volatile unsigned int*)buffer;
-}
-
-
-
-bool msgpack_unpacker_init(msgpack_unpacker* mpac, size_t initial_buffer_size)
-{
- if(initial_buffer_size < COUNTER_SIZE) {
- initial_buffer_size = COUNTER_SIZE;
- }
-
- char* buffer = (char*)malloc(initial_buffer_size);
- if(buffer == NULL) {
- return false;
- }
-
- void* ctx = malloc(sizeof(template_context));
- if(ctx == NULL) {
- free(buffer);
- return false;
- }
-
- msgpack_zone* z = msgpack_zone_new(MSGPACK_ZONE_CHUNK_SIZE);
- if(z == NULL) {
- free(ctx);
- free(buffer);
- return false;
- }
-
- mpac->buffer = buffer;
- mpac->used = COUNTER_SIZE;
- mpac->free = initial_buffer_size - mpac->used;
- mpac->off = COUNTER_SIZE;
- mpac->parsed = 0;
- mpac->initial_buffer_size = initial_buffer_size;
- mpac->z = z;
- mpac->ctx = ctx;
-
- init_count(mpac->buffer);
-
- template_init(CTX_CAST(mpac->ctx));
- CTX_CAST(mpac->ctx)->user.z = mpac->z;
- CTX_CAST(mpac->ctx)->user.referenced = false;
-
- return true;
-}
-
-void msgpack_unpacker_destroy(msgpack_unpacker* mpac)
-{
- msgpack_zone_free(mpac->z);
- free(mpac->ctx);
- decl_count(mpac->buffer);
-}
-
-
-msgpack_unpacker* msgpack_unpacker_new(size_t initial_buffer_size)
-{
- msgpack_unpacker* mpac = (msgpack_unpacker*)malloc(sizeof(msgpack_unpacker));
- if(mpac == NULL) {
- return NULL;
- }
-
- if(!msgpack_unpacker_init(mpac, initial_buffer_size)) {
- free(mpac);
- return NULL;
- }
-
- return mpac;
-}
-
-void msgpack_unpacker_free(msgpack_unpacker* mpac)
-{
- msgpack_unpacker_destroy(mpac);
- free(mpac);
-}
-
-bool msgpack_unpacker_expand_buffer(msgpack_unpacker* mpac, size_t size)
-{
- if(mpac->used == mpac->off && get_count(mpac->buffer) == 1
- && !CTX_REFERENCED(mpac)) {
- // rewind buffer
- mpac->free += mpac->used - COUNTER_SIZE;
- mpac->used = COUNTER_SIZE;
- mpac->off = COUNTER_SIZE;
-
- if(mpac->free >= size) {
- return true;
- }
- }
-
- if(mpac->off == COUNTER_SIZE) {
- size_t next_size = (mpac->used + mpac->free) * 2; // include COUNTER_SIZE
- while(next_size < size + mpac->used) {
- next_size *= 2;
- }
-
- char* tmp = (char*)realloc(mpac->buffer, next_size);
- if(tmp == NULL) {
- return false;
- }
-
- mpac->buffer = tmp;
- mpac->free = next_size - mpac->used;
-
- } else {
- size_t next_size = mpac->initial_buffer_size; // include COUNTER_SIZE
- size_t not_parsed = mpac->used - mpac->off;
- while(next_size < size + not_parsed + COUNTER_SIZE) {
- next_size *= 2;
- }
-
- char* tmp = (char*)malloc(next_size);
- if(tmp == NULL) {
- return false;
- }
-
- init_count(tmp);
-
- memcpy(tmp+COUNTER_SIZE, mpac->buffer+mpac->off, not_parsed);
-
- if(CTX_REFERENCED(mpac)) {
- if(!msgpack_zone_push_finalizer(mpac->z, decl_count, mpac->buffer)) {
- free(tmp);
- return false;
- }
- CTX_REFERENCED(mpac) = false;
- } else {
- decl_count(mpac->buffer);
- }
-
- mpac->buffer = tmp;
- mpac->used = not_parsed + COUNTER_SIZE;
- mpac->free = next_size - mpac->used;
- mpac->off = COUNTER_SIZE;
- }
-
- return true;
-}
-
-int msgpack_unpacker_execute(msgpack_unpacker* mpac)
-{
- size_t off = mpac->off;
- int ret = template_execute(CTX_CAST(mpac->ctx),
- mpac->buffer, mpac->used, &mpac->off);
- if(mpac->off > off) {
- mpac->parsed += mpac->off - off;
- }
- return ret;
-}
-
-msgpack_unpack_object msgpack_unpacker_data(msgpack_unpacker* mpac)
-{
- return template_data(CTX_CAST(mpac->ctx));
-}
-
-msgpack_zone* msgpack_unpacker_release_zone(msgpack_unpacker* mpac)
-{
- if(!msgpack_unpacker_flush_zone(mpac)) {
- return false;
- }
-
- msgpack_zone* r = msgpack_zone_new(MSGPACK_ZONE_CHUNK_SIZE);
- if(r == NULL) {
- return NULL;
- }
-
- msgpack_zone* old = mpac->z;
- mpac->z = r;
-
- return old;
-}
-
-void msgpack_unpacker_reset_zone(msgpack_unpacker* mpac)
-{
- msgpack_zone_clear(mpac->z);
-}
-
-bool msgpack_unpacker_flush_zone(msgpack_unpacker* mpac)
-{
- if(CTX_REFERENCED(mpac)) {
- if(!msgpack_zone_push_finalizer(mpac->z, decl_count, mpac->buffer)) {
- return false;
- }
- CTX_REFERENCED(mpac) = false;
-
- incr_count(mpac->buffer);
- }
-
- return true;
-}
-
-void msgpack_unpacker_reset(msgpack_unpacker* mpac)
-{
- template_init(CTX_CAST(mpac->ctx));
- // don't reset referenced flag
- mpac->parsed = 0;
-}
-
-
-msgpack_unpack_return
-msgpack_unpack(const char* data, size_t len, size_t* off,
- msgpack_zone* z, msgpack_unpack_object* result)
-{
- template_context ctx;
- template_init(&ctx);
-
- ctx.user.z = z;
- ctx.user.referenced = false;
-
- size_t noff = 0;
- if(off != NULL) { noff = *off; }
-
- int ret = template_execute(&ctx, data, len, &noff);
- if(ret < 0) {
- return MSGPACK_UNPACK_PARSE_ERROR;
- }
-
- if(off != NULL) { *off = noff; }
-
- if(ret == 0) {
- return MSGPACK_UNPACK_CONTINUE;
- }
-
- *result = template_data(&ctx);
-
- if(noff < len) {
- return MSGPACK_UNPACK_EXTRA_BYTES;
- }
-
- return MSGPACK_UNPACK_SUCCESS;
-}
-#endif