push.c 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. /* CC0 license (public domain) - see LICENSE file for details */
  2. #include "push.h"
  3. #include <ccan/endian/endian.h>
  4. #include <string.h>
  5. static void *(*push_reallocfn)(void *ptr, size_t size) = realloc;
  6. bool push_bytes(char **p, size_t *len, const void *src, size_t srclen)
  7. {
  8. char *n = push_reallocfn(*p, *len + srclen);
  9. if (!n)
  10. return false;
  11. *p = n;
  12. if (src)
  13. memcpy(*p + *len, src, srclen);
  14. else
  15. memset(*p + *len, 0, srclen);
  16. *len += srclen;
  17. return true;
  18. }
  19. bool push_u64(char **p, size_t *len, uint64_t val)
  20. {
  21. leint64_t v = cpu_to_le64(val);
  22. return push_bytes(p, len, &v, sizeof(v));
  23. }
  24. bool push_u32(char **p, size_t *len, uint32_t val)
  25. {
  26. leint32_t v = cpu_to_le32(val);
  27. return push_bytes(p, len, &v, sizeof(v));
  28. }
  29. bool push_u16(char **p, size_t *len, uint16_t val)
  30. {
  31. leint16_t v = cpu_to_le16(val);
  32. return push_bytes(p, len, &v, sizeof(v));
  33. }
  34. bool push_u8(char **p, size_t *len, uint8_t val)
  35. {
  36. return push_bytes(p, len, &val, sizeof(val));
  37. }
  38. bool push_s64(char **p, size_t *len, int64_t val)
  39. {
  40. return push_u64(p, len, val);
  41. }
  42. bool push_s32(char **p, size_t *len, int32_t val)
  43. {
  44. return push_u32(p, len, val);
  45. }
  46. bool push_s16(char **p, size_t *len, int16_t val)
  47. {
  48. return push_u16(p, len, val);
  49. }
  50. bool push_s8(char **p, size_t *len, int8_t val)
  51. {
  52. return push_u8(p, len, val);
  53. }
  54. bool push_char(char **p, size_t *len, char val)
  55. {
  56. return push_u8(p, len, val);
  57. }
  58. void push_set_realloc(void *(*reallocfn)(void *ptr, size_t size))
  59. {
  60. push_reallocfn = reallocfn;
  61. }