76 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			76 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #include "varint_pair.h"
 | |
| #include <toolbox/varint.h>
 | |
| 
 | |
| #define VARINT_PAIR_SIZE 10
 | |
| 
 | |
| struct VarintPair {
 | |
|     size_t data_length;
 | |
|     uint8_t data[VARINT_PAIR_SIZE];
 | |
| };
 | |
| 
 | |
| VarintPair* varint_pair_alloc() {
 | |
|     VarintPair* pair = malloc(sizeof(VarintPair));
 | |
|     pair->data_length = 0;
 | |
|     return pair;
 | |
| }
 | |
| 
 | |
| void varint_pair_free(VarintPair* pair) {
 | |
|     free(pair);
 | |
| }
 | |
| 
 | |
| bool varint_pair_pack(VarintPair* pair, bool first, uint32_t value) {
 | |
|     bool result = false;
 | |
| 
 | |
|     if(first) {
 | |
|         if(pair->data_length == 0) {
 | |
|             pair->data_length = varint_uint32_pack(value, pair->data);
 | |
|         } else {
 | |
|             pair->data_length = 0;
 | |
|         }
 | |
|     } else {
 | |
|         if(pair->data_length != 0) {
 | |
|             pair->data_length += varint_uint32_pack(value, pair->data + pair->data_length);
 | |
|             result = true;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     return result;
 | |
| }
 | |
| 
 | |
| bool varint_pair_unpack(
 | |
|     uint8_t* data,
 | |
|     size_t data_length,
 | |
|     uint32_t* value_1,
 | |
|     uint32_t* value_2,
 | |
|     size_t* length) {
 | |
|     size_t size = 0;
 | |
|     uint32_t tmp_value_1;
 | |
|     uint32_t tmp_value_2;
 | |
| 
 | |
|     size += varint_uint32_unpack(&tmp_value_1, &data[size], data_length);
 | |
| 
 | |
|     if(size >= data_length) {
 | |
|         return false;
 | |
|     }
 | |
| 
 | |
|     size += varint_uint32_unpack(&tmp_value_2, &data[size], (size_t)(data_length - size));
 | |
| 
 | |
|     *value_1 = tmp_value_1;
 | |
|     *value_2 = tmp_value_2;
 | |
|     *length = size;
 | |
| 
 | |
|     return true;
 | |
| }
 | |
| 
 | |
| uint8_t* varint_pair_get_data(VarintPair* pair) {
 | |
|     return pair->data;
 | |
| }
 | |
| 
 | |
| size_t varint_pair_get_size(VarintPair* pair) {
 | |
|     return pair->data_length;
 | |
| }
 | |
| 
 | |
| void varint_pair_reset(VarintPair* pair) {
 | |
|     pair->data_length = 0;
 | |
| }
 | 
