c backend refact, implementing serilizer
[PxpRpc.git] / c / pxprpc / serilizer.c
blobc3c49681255bd10db19eb40770978a2ede917b94
2 #include <pxprpc.h>
3 #include <stdlib.h>
5 static void _pxprpc_ensure_buf(struct pxprpc_serilizer *ser,uint32_t remain){
6 if(ser->cap-ser->pos<remain){
7 int newsize=ser->pos+remain;
8 newsize+=newsize>>1;
9 ser->buf=pxprpc__realloc(ser->buf,newsize);
13 extern void pxprpc_ser_prepare_ser(struct pxprpc_serilizer *ser,int initBufSize){
14 ser->buf=pxprpc__malloc(initBufSize);
15 ser->cap=initBufSize;
16 ser->pos=0;
18 extern void pxprpc_ser_prepare_unser(struct pxprpc_serilizer *ser,void *buf,uint32_t size){
19 ser->cap=size;
20 ser->pos=0;
21 ser->buf=buf;
24 extern void pxprpc_ser_put_int(struct pxprpc_serilizer *ser,uint32_t val){
25 _pxprpc_ensure_buf(ser,4);
26 *(uint32_t *)(ser->buf+ser->pos)=val;
27 ser->pos+=4;
29 extern void pxprpc_ser_put_long(struct pxprpc_serilizer *ser,uint64_t val){
30 _pxprpc_ensure_buf(ser,8);
31 *(uint64_t *)(ser->buf+ser->pos)=val;
32 ser->pos+=8;
34 extern void pxprpc_ser_put_float(struct pxprpc_serilizer *ser,float val){
35 _pxprpc_ensure_buf(ser,4);
36 *(float *)(ser->buf+ser->pos)=val;
37 ser->pos+=4;
39 extern void pxprpc_ser_put_double(struct pxprpc_serilizer *ser,double val){
40 _pxprpc_ensure_buf(ser,8);
41 *(double *)(ser->buf+ser->pos)=val;
42 ser->pos+=8;
44 extern void pxprpc_ser_put_bytes(struct pxprpc_serilizer *ser,struct pxprpc_bytes *val){
45 if(val->length<=0xff){
46 _pxprpc_ensure_buf(ser,1+val->length);
47 *(ser->buf+ser->pos)=val->length;
48 ser->pos++;
49 }else{
50 _pxprpc_ensure_buf(ser,5+val->length);
51 *(ser->buf+ser->pos)=0xff;
52 ser->pos++;
53 *(uint32_t *)(ser->buf+ser->pos)=val->length;
54 ser->pos+=4;
56 memcpy(ser->buf+ser->pos,&val->data,val->length);
57 ser->pos+=val->length;
59 extern uint32_t pxprpc_ser_get_int(struct pxprpc_serilizer *ser){
60 uint32_t val=*(uint32_t *)ser->buf+ser->pos;
61 ser->pos+=4;
62 return val;
64 extern uint64_t pxprpc_ser_get_long(struct pxprpc_serilizer *ser){
65 uint64_t val=*(uint64_t *)ser->buf+ser->pos;
66 ser->pos+=8;
67 return val;
69 extern float pxprpc_ser_get_float(struct pxprpc_serilizer *ser){
70 float val=*(float *)ser->buf+ser->pos;
71 ser->pos+=4;
72 return val;
74 extern double pxprpc_ser_get_double(struct pxprpc_serilizer *ser){
75 double val=*(double *)ser->buf+ser->pos;
76 ser->pos+=8;
77 return val;
79 extern struct pxprpc_bytes *pxprpc_ser_get_bytes(struct pxprpc_serilizer *ser){
80 int len=*(ser->buf+ser->pos);
81 ser->pos++;
82 if(len==0xff){
83 len=*(uint32_t *)(ser->buf+ser->pos);
84 ser->pos+=4;
86 struct pxprpc_bytes *val=(struct pxprpc_bytes *)pxprpc__malloc(4+len);
88 memcpy(&val->data,ser->buf+ser->pos,len);
89 ser->pos+=val->length;
90 return val;