pylibrlp

Python3 wrapper for librlp
git clone git://git.defalsify.org/pylibrlp.git
Log | Files | Refs | LICENSE

encode.c (1806B)


      1 #include <stdint.h>
      2 #include <string.h>
      3 
      4 #include "rlp.h"
      5 #include "bits.h"
      6 #include "endian.h"
      7 
      8 
      9 int rlp_add(rlp_encoder_t *encoder, int len, const char *data) {
     10 	char v;
     11 	int lenlen;
     12 	size_t r;
     13 
     14 	r = (size_t)encoder->ptr;
     15 
     16 	if (len == 0) {
     17 		*(encoder->ptr) = 0x80;
     18 		encoder->ptr++;
     19 		encoder->size++;
     20 	} else {
     21 		v = (char)*data;
     22 		if (len == 1 && v < 56) {
     23 			*(encoder->ptr) = v;
     24 			encoder->ptr++;
     25 		} else {
     26 			v = (char)*data;
     27 			if (len < 56) {
     28 				*(encoder->ptr) = len + 0x80;
     29 				encoder->ptr++;
     30 				memcpy(encoder->ptr, data, len);
     31 				encoder->ptr += len;
     32 				encoder->size++;
     33 			} else {
     34 				lenlen = intbytes_le(sizeof(int), (char*)&len);
     35 				*(encoder->ptr) = lenlen + 0xb7;
     36 				encoder->ptr++;
     37 				to_endian(CONVERT_BIGENDIAN, lenlen, &len);
     38 				memcpy(encoder->ptr, &len, lenlen);
     39 				to_endian(CONVERT_PLATFORM, lenlen, &len);
     40 				encoder->ptr += lenlen;
     41 				memcpy(encoder->ptr, data, len); 
     42 				encoder->ptr += len;
     43 				encoder->size += 1 + lenlen;
     44 			}
     45 		}
     46 	}
     47 
     48 	encoder->size += len;
     49 	
     50 	return (int)(r - (size_t)encoder->ptr);
     51 }
     52 
     53 int rlp_descend(rlp_encoder_t *encoder) {
     54 	encoder->depth++;
     55 	encoder->list_ptr[encoder->depth] = encoder->ptr;
     56 	return encoder->depth;
     57 }
     58 
     59 int rlp_ascend(rlp_encoder_t *encoder) {
     60 	size_t len;
     61 	char *ptr;
     62 	int lenlen;
     63 
     64 	ptr = encoder->list_ptr[encoder->depth];
     65 	len = encoder->ptr - ptr;
     66 	if (len < 56) {
     67 		memcpy(ptr + 1, ptr, len);
     68 		*(ptr) = 0xc0 + len;
     69 		encoder->ptr++;
     70 		encoder->size++;
     71 	} else {
     72 		lenlen = intbytes_le(sizeof(size_t), (char*)&len);
     73 		memcpy(ptr + 1 + lenlen, ptr, len);
     74 		*ptr = lenlen + 0xf7;
     75 		to_endian(CONVERT_BIGENDIAN, lenlen, &len);
     76 		memcpy(ptr+1, &len, lenlen);
     77 		to_endian(CONVERT_PLATFORM, lenlen, &len);
     78 		encoder->ptr += (lenlen + 1);
     79 		encoder->size + 1 + lenlen;
     80 	}
     81 	encoder->depth--;
     82 
     83 	return encoder->depth;
     84 }