pushpull: new module.
[ccan] / ccan / pushpull / pull.c
1 /* CC0 license (public domain) - see LICENSE file for details */
2 #include "pull.h"
3 #include <ccan/endian/endian.h>
4 #include <string.h>
5
6 bool pull_bytes(const char **p, size_t *max_len, void *dst, size_t len)
7 {
8         if (*max_len < len) {
9                 *p = NULL;
10                 *max_len = 0;
11                 return false;
12         }
13         if (dst)
14                 memcpy(dst, *p, len);
15         *max_len -= len;
16         *p += len;
17         return true;
18 }
19
20 bool pull_u64(const char **p, size_t *max_len, uint64_t *val)
21 {
22         leint64_t v;
23
24         if (pull_bytes(p, max_len, &v, sizeof(v))) {
25                 if (val)
26                         *val = le64_to_cpu(v);
27                 return true;
28         }
29         return false;
30 }
31
32 bool pull_u32(const char **p, size_t *max_len, uint32_t *val)
33 {
34         leint32_t v;
35
36         if (pull_bytes(p, max_len, &v, sizeof(v))) {
37                 if (val)
38                         *val = le32_to_cpu(v);
39                 return true;
40         }
41         return false;
42 }
43
44 bool pull_u16(const char **p, size_t *max_len, uint16_t *val)
45 {
46         leint16_t v;
47
48         if (pull_bytes(p, max_len, &v, sizeof(v))) {
49                 if (val)
50                         *val = le16_to_cpu(v);
51                 return true;
52         }
53         return false;
54 }
55
56 bool pull_u8(const char **p, size_t *max_len, uint8_t *val)
57 {
58         return pull_bytes(p, max_len, val, sizeof(*val));
59 }
60
61 bool pull_s64(const char **p, size_t *max_len, int64_t *val)
62 {
63         leint64_t v;
64
65         if (pull_bytes(p, max_len, &v, sizeof(v))) {
66                 if (val)
67                         *val = le64_to_cpu(v);
68                 return true;
69         }
70         return false;
71 }
72
73 bool pull_s32(const char **p, size_t *max_len, int32_t *val)
74 {
75         leint32_t v;
76
77         if (pull_bytes(p, max_len, &v, sizeof(v))) {
78                 if (val)
79                         *val = le32_to_cpu(v);
80                 return true;
81         }
82         return false;
83 }
84
85 bool pull_s16(const char **p, size_t *max_len, int16_t *val)
86 {
87         leint16_t v;
88
89         if (pull_bytes(p, max_len, &v, sizeof(v))) {
90                 if (val)
91                         *val = le16_to_cpu(v);
92                 return true;
93         }
94         return false;
95 }
96
97 bool pull_s8(const char **p, size_t *max_len, int8_t *val)
98 {
99         return pull_bytes(p, max_len, val, sizeof(*val));
100 }
101
102 bool pull_char(const char **p, size_t *max_len, char *val)
103 {
104         return pull_bytes(p, max_len, val, sizeof(*val));
105 }