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 }