pushpull: new module.
[ccan] / ccan / pushpull / push.c
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
6 static void *(*push_reallocfn)(void *ptr, size_t size) = realloc;
7
8 bool push_bytes(char **p, size_t *len, const void *src, size_t srclen)
9 {
10         char *n = push_reallocfn(*p, *len + srclen);
11         if (!n)
12                 return false;
13         *p = n;
14         if (src)
15                 memcpy(*p + *len, src, srclen);
16         else
17                 memset(*p + *len, 0, srclen);
18         *len += srclen;
19         return true;
20 }
21
22 bool push_u64(char **p, size_t *len, uint64_t val)
23 {
24         leint64_t v = cpu_to_le64(val);
25         return push_bytes(p, len, &v, sizeof(v));
26 }
27
28 bool push_u32(char **p, size_t *len, uint32_t val)
29 {
30         leint32_t v = cpu_to_le32(val);
31         return push_bytes(p, len, &v, sizeof(v));
32 }
33
34 bool push_u16(char **p, size_t *len, uint16_t val)
35 {
36         leint16_t v = cpu_to_le16(val);
37         return push_bytes(p, len, &v, sizeof(v));
38 }
39
40 bool push_u8(char **p, size_t *len, uint8_t val)
41 {
42         return push_bytes(p, len, &val, sizeof(val));
43 }
44
45 bool push_s64(char **p, size_t *len, int64_t val)
46 {
47         return push_u64(p, len, val);
48 }
49
50 bool push_s32(char **p, size_t *len, int32_t val)
51 {
52         return push_u32(p, len, val);
53 }
54
55 bool push_s16(char **p, size_t *len, int16_t val)
56 {
57         return push_u16(p, len, val);
58 }
59
60 bool push_s8(char **p, size_t *len, int8_t val)
61 {
62         return push_u8(p, len, val);
63 }
64
65 bool push_char(char **p, size_t *len, char val)
66 {
67         return push_u8(p, len, val);
68 }
69
70 void push_set_realloc(void *(*reallocfn)(void *ptr, size_t size))
71 {
72         push_reallocfn = reallocfn;
73 }