varint_pair.c 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #include "varint_pair.h"
  2. #include <toolbox/varint.h>
  3. #define VARINT_PAIR_SIZE 10
  4. struct VarintPair {
  5. size_t data_length;
  6. uint8_t data[VARINT_PAIR_SIZE];
  7. };
  8. VarintPair* varint_pair_alloc() {
  9. VarintPair* pair = malloc(sizeof(VarintPair));
  10. pair->data_length = 0;
  11. return pair;
  12. }
  13. void varint_pair_free(VarintPair* pair) {
  14. free(pair);
  15. }
  16. bool varint_pair_pack(VarintPair* pair, bool first, uint32_t value) {
  17. bool result = false;
  18. if(first) {
  19. if(pair->data_length == 0) {
  20. pair->data_length = varint_uint32_pack(value, pair->data);
  21. } else {
  22. pair->data_length = 0;
  23. }
  24. } else {
  25. if(pair->data_length > 0) {
  26. pair->data_length += varint_uint32_pack(value, pair->data + pair->data_length);
  27. result = true;
  28. } else {
  29. pair->data_length = 0;
  30. }
  31. }
  32. return result;
  33. }
  34. bool varint_pair_unpack(
  35. uint8_t* data,
  36. size_t data_length,
  37. uint32_t* value_1,
  38. uint32_t* value_2,
  39. size_t* length) {
  40. size_t size = 0;
  41. uint32_t tmp_value_1;
  42. uint32_t tmp_value_2;
  43. size += varint_uint32_unpack(&tmp_value_1, &data[size], data_length);
  44. if(size >= data_length) {
  45. return false;
  46. }
  47. size += varint_uint32_unpack(&tmp_value_2, &data[size], (size_t)(data_length - size));
  48. *value_1 = tmp_value_1;
  49. *value_2 = tmp_value_2;
  50. *length = size;
  51. return true;
  52. }
  53. uint8_t* varint_pair_get_data(VarintPair* pair) {
  54. return pair->data;
  55. }
  56. size_t varint_pair_get_size(VarintPair* pair) {
  57. return pair->data_length;
  58. }
  59. void varint_pair_reset(VarintPair* pair) {
  60. pair->data_length = 0;
  61. }