#ifndef __BENCODE_H_
#define __BENCODE_H_
+#include<inttypes.h>
#include<stddef.h>
#include<stdint.h>
#include<stdio.h>
ssize_t bencode_list_end(uint8_t*,size_t);
ssize_t bencode_list_start(uint8_t*,size_t);
ssize_t bencode_size(size_t,uint8_t*,size_t);
-size_t bencode_size_int(int);
+size_t bencode_size_int(intmax_t);
ssize_t bencode_string(const uint8_t*,size_t,uint8_t*,size_t);
#endif
ssize_t bencode_size(size_t len, uint8_t *output, size_t output_size) {
size_t i;
+ if(len>INTMAX_MAX) { return -1; }
+
i = bencode_size_int(len);
i++; // account for ':'
if(i>output_size) { return -1; }
return i;
}
-size_t bencode_size_int(int i) {
+size_t bencode_size_int(intmax_t i) {
size_t j = (i<0)?1:0;
- i = abs(i);
+ i = imaxabs(i);
if(0==i) { return 1; }
while(i>0) {
static void bdecode_type_basic_test();
static void bencode_dict_basic_test();
static void bencode_list_basic_test();
+static void bencode_size_basic_test();
+static void bencode_size_int_basic_test();
static void bencode_string_basic_test();
int main() {
bdecode_type_basic_test();
bencode_dict_basic_test();
bencode_list_basic_test();
+ bencode_size_basic_test();
+ bencode_size_int_basic_test();
bencode_string_basic_test();
clean_env();
assert(memcmp(buf,"l4:spam4:eggse",14)==0);
}
+static void bencode_size_basic_test() {
+ uint8_t buf[1024];
+
+ assert(bencode_size(0,buf,1)==-1);
+ assert(bencode_size(0,buf,2)==2);
+
+ assert(bencode_size(1234567890,buf,1024)==11);
+
+ assert(bencode_size(SIZE_MAX,buf,1024)==-1);
+ assert(bencode_size(INTMAX_MAX,buf,1024)>0);
+}
+
+static void bencode_size_int_basic_test() {
+ assert(bencode_size_int(0)==1);
+ assert(bencode_size_int(-1)==2);
+ assert(bencode_size_int(109)==3);
+ assert(bencode_size_int(23984723984)==11);
+ assert(bencode_size_int(922337203685477580)==18);
+ assert(bencode_size_int(INTMAX_MIN)>0);
+ assert(bencode_size_int(INTMAX_MAX)>0);
+}
+
static void bencode_string_basic_test() {
uint8_t buf[1024];