sparsemap/include/bencode.h
2024-05-20 11:06:04 -04:00

141 lines
2.8 KiB
C

// https://github.com/willemt/heapless-bencode
//
#ifndef BENCODE_H_
#define BENCODE_H_
typedef struct
{
const char *str;
const char *start;
void *parent;
int val;
int len;
} bencode_t;
/**
* Initialise a bencode object.
* @param be The bencode object
* @param str Buffer we expect input from
* @param len Length of buffer
*/
void bencode_init(
bencode_t * be,
const char *str,
int len
);
/**
* @return 1 if the bencode object is an int; otherwise 0.
*/
int bencode_is_int(
const bencode_t * be
);
/**
* @return 1 if the bencode object is a string; otherwise 0.
*/
int bencode_is_string(
const bencode_t * be
);
/**
* @return 1 if the bencode object is a list; otherwise 0.
*/
int bencode_is_list(
const bencode_t * be
);
/**
* @return 1 if the bencode object is a dict; otherwise 0.
*/
int bencode_is_dict(
const bencode_t * be
);
/**
* Obtain value from integer bencode object.
* @param val Long int we are writing the result to
* @return 1 on success, otherwise 0
*/
int bencode_int_value(
bencode_t * be,
long int *val
);
/**
* @return 1 if there is another item on this dict; otherwise 0.
*/
int bencode_dict_has_next(
bencode_t * be
);
/**
* Get the next item within this dictionary.
* @param be_item Next item.
* @param key Const pointer to key string of next item.
* @param klen Length of the key of next item.
* @return 1 on success; otherwise 0.
*/
int bencode_dict_get_next(
bencode_t * be,
bencode_t * be_item,
const char **key,
int *klen
);
/**
* Get the string value from this bencode object.
* The buffer returned is stored on the stack.
* @param be The bencode object.
* @param str Const pointer to the buffer.
* @param slen Length of the buffer we are outputting.
* @return 1 on success; otherwise 0
*/
int bencode_string_value(
bencode_t * be,
const char **str,
int *len
);
/**
* Tell if there is another item within this list.
* @param be The bencode object
* @return 1 if another item exists on the list; 0 otherwise; -1 on invalid processing
*/
int bencode_list_has_next(
bencode_t * be
);
/**
* Get the next item within this list.
* @param be The bencode object
* @param be_item The next bencode object that we are going to initiate.
* @return return 0 on end; 1 on have next; -1 on error
*/
int bencode_list_get_next(
bencode_t * be,
bencode_t * be_item
);
/**
* Copy bencode object into other bencode object
*/
void bencode_clone(
bencode_t * be,
bencode_t * output
);
/**
* Get the start and end position of this dictionary
* @param be Bencode object
* @param start Starting string
* @param len Length of the dictionary
* @return 0 on success
*/
int bencode_dict_get_start_and_len(
bencode_t * be,
const char **start,
int *len
);
#endif /* BENCODE_H_ */