varint_pair.c 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  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. }
  29. }
  30. return result;
  31. }
  32. bool varint_pair_unpack(
  33. uint8_t* data,
  34. size_t data_length,
  35. uint32_t* value_1,
  36. uint32_t* value_2,
  37. size_t* length) {
  38. size_t size = 0;
  39. uint32_t tmp_value_1;
  40. uint32_t tmp_value_2;
  41. size += varint_uint32_unpack(&tmp_value_1, &data[size], data_length);
  42. if(size >= data_length) {
  43. return false;
  44. }
  45. size += varint_uint32_unpack(&tmp_value_2, &data[size], (size_t)(data_length - size));
  46. *value_1 = tmp_value_1;
  47. *value_2 = tmp_value_2;
  48. *length = size;
  49. return true;
  50. }
  51. uint8_t* varint_pair_get_data(VarintPair* pair) {
  52. return pair->data;
  53. }
  54. size_t varint_pair_get_size(VarintPair* pair) {
  55. return pair->data_length;
  56. }
  57. void varint_pair_reset(VarintPair* pair) {
  58. pair->data_length = 0;
  59. }