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;
 | 
						|
}
 |