Revision 4 (by moose, 2009/02/13 04:09:19) * add msgtest2.pl test for new highlevel api
* separate XS into Message and Item related code
* remove Makefile.old from svn
* add encode/decode support to hl CSE::Proto::Message class
* convert CSE::Proto::C::Item to use a simple blessed pointer instead of a hashref holding the handle
* fix CSE::Proto::Message::Item::clone to properly clone the value, not just copy an ARRAY ref
* add support for MESSAGE type items in the parser
#include "itemtype.h"

MODULE = CSE::Proto::C::Message     PACKAGE = CSE::Proto::C::Message PREFIX = cseproto_

PROTOTYPES: enable

BOOT:
	{
		HV *stash;
		HV *item_stash;

		stash = gv_stashpv("CSE::Proto::C", TRUE);
		newCONSTSUB(stash, "KEYTYPEBITS", newSViv(CSEPROTO_KEYTYPEBITS));
		newCONSTSUB(stash, "KEYTYPEMASK", newSViv(CSEPROTO_KEYTYPEMASK));
		
		newCONSTSUB(stash, "WIRETYPE_VARINT",   newSViv(CSE_WIRETYPE_VARINT));
		newCONSTSUB(stash, "WIRETYPE_SVARINT",  newSViv(CSE_WIRETYPE_SVARINT));
		newCONSTSUB(stash, "WIRETYPE_64BIT",    newSViv(CSE_WIRETYPE_64BIT));
		newCONSTSUB(stash, "WIRETYPE_32BIT",    newSViv(CSE_WIRETYPE_32BIT));
		newCONSTSUB(stash, "WIRETYPE_LENDELIM", newSViv(CSE_WIRETYPE_LENDELIM));

      boot_CSE__Proto__C__Item(aTHX_ cv);
	}



int
cseproto_add_item(proto, item)
	CSE_Proto_C_Message  proto
	CSE_Proto_C_Item  item
   INIT:
      //printf("proto: %p, item: %p\n", proto, item);

CSE_Proto_C_Message
cseproto_create(buckets)
	uint32_t	buckets

size_t
cseproto_decode(proto, data)
	CSE_Proto_C_Message  proto
	SV *	data
   PREINIT:
      size_t length;
   CODE:
      length = sv_len(data);
      RETVAL = cseproto_decode_data(proto, length, sv_pv(data));
   OUTPUT:
      RETVAL

void
cseproto_destroy(proto)
	CSE_Proto_C_Message  proto

SV *
cseproto_encode(cp)
	CSE_Proto_C_Message  cp
   PREINIT:
      uint8_t *data;
      size_t len;
   CODE:
      len = cseproto_encode(cp, &data);
      RETVAL = newSVpv(data, len);
   OUTPUT:
      RETVAL
      

SV *
cseproto_get_item(proto, key)
   CSE_Proto_C_Message  proto
   uint32_t key
   INIT:
      SV *item_sv;
      CSE_Proto_C_Item item;
   CODE:
      item = cseproto_get_item(proto, key);
      item_sv = newSV(0);
      sv_setref_pv(item_sv, "CSE::Proto::C::Item", (void*)item);
      RETVAL = item_sv;
   OUTPUT:
      RETVAL

SV *
cseproto_get_item_head(proto, key)
   CSE_Proto_C_Message  proto
   uint32_t key
   INIT:
      SV *item_sv;
      CSE_Proto_C_Item item;
   CODE:
      item = cseproto_get_item_head(proto, key);
      item_sv = newSV(0);
      sv_setref_pv(item_sv, "CSE::Proto::C::Item", (void*)item);
      RETVAL = item_sv;
   OUTPUT:
      RETVAL

SV *
cseproto_get_item_tail(proto, key)
   CSE_Proto_C_Message  proto
   uint32_t key
   INIT:
      SV *item_sv;
      CSE_Proto_C_Item item;
   CODE:
      item = cseproto_get_item_tail(proto, key);
      item_sv = newSV(0);
      sv_setref_pv(item_sv, "CSE::Proto::C::Item", (void*)item);
      RETVAL = item_sv;
   OUTPUT:
      RETVAL
      
size_t
cseproto_message_size(proto)
	CSE_Proto_C_Message  proto

int
cseproto_remove_item(proto, item)
	CSE_Proto_C_Message  proto
	CSE_Proto_C_Item  item