util/docker: Update dockerfiles
[coreboot.git] / src / commonlib / iobuf.c
blob042e8dd47ecb10fe8141d2b02ad31a00083c179d
1 /* SPDX-License-Identifier: GPL-2.0-only */
3 #include <commonlib/endian.h>
4 #include <commonlib/iobuf.h>
5 #include <string.h>
7 static int ibuf_check_size(const struct ibuf *ib, size_t sz)
9 if (ibuf_remaining(ib) < sz)
10 return -1;
12 return 0;
15 void ibuf_init(struct ibuf *ib, const void *b, size_t sz)
17 ib->b = b;
18 ib->n_read = 0;
19 ib->capacity = sz;
22 void ibuf_from_obuf(struct ibuf *ib, const struct obuf *ob)
24 ibuf_init(ib, ob->b, ob->n_written);
27 int ibuf_splice(const struct ibuf *src, struct ibuf *dst, size_t off, size_t sz)
29 size_t end = off + sz;
30 size_t capacity = ibuf_capacity(src);
31 size_t nr_read = ibuf_nr_read(src);
33 if (end < off || end < sz || end > capacity)
34 return -1;
36 ibuf_init(dst, &src->b[off], sz);
38 /* Handle previously read data in src. */
39 if (off < nr_read)
40 dst->n_read = nr_read - off;
42 return 0;
45 int ibuf_splice_current(const struct ibuf *src, struct ibuf *dst, size_t sz)
47 return ibuf_splice(src, dst, ibuf_nr_read(src), sz);
50 int ibuf_split(const struct ibuf *src, struct ibuf *a, struct ibuf *b,
51 size_t boundary)
53 if (ibuf_splice(src, a, 0, boundary))
54 return -1;
56 return ibuf_splice(src, b, boundary, ibuf_capacity(src) - boundary);
59 const void *ibuf_oob_drain(struct ibuf *ib, size_t sz)
61 const void *b;
63 if (ibuf_check_size(ib, sz))
64 return NULL;
66 b = &ib->b[ib->n_read];
67 ib->n_read += sz;
69 return b;
72 int ibuf_read(struct ibuf *ib, void *data, size_t sz)
74 const void *b = ibuf_oob_drain(ib, sz);
76 if (b == NULL)
77 return -1;
79 memcpy(data, b, sz);
81 return 0;
84 int ibuf_read_be8(struct ibuf *ib, uint8_t *v)
86 size_t sz = sizeof(*v);
88 if (ibuf_check_size(ib, sz))
89 return -1;
91 *v = read_at_be8(ib->b, ib->n_read);
92 ib->n_read += sz;
94 return 0;
97 int ibuf_read_be16(struct ibuf *ib, uint16_t *v)
99 size_t sz = sizeof(*v);
101 if (ibuf_check_size(ib, sz))
102 return -1;
104 *v = read_at_be16(ib->b, ib->n_read);
105 ib->n_read += sz;
107 return 0;
110 int ibuf_read_be32(struct ibuf *ib, uint32_t *v)
112 size_t sz = sizeof(*v);
114 if (ibuf_check_size(ib, sz))
115 return -1;
117 *v = read_at_be32(ib->b, ib->n_read);
118 ib->n_read += sz;
120 return 0;
123 int ibuf_read_be64(struct ibuf *ib, uint64_t *v)
125 size_t sz = sizeof(*v);
127 if (ibuf_check_size(ib, sz))
128 return -1;
130 *v = read_at_be64(ib->b, ib->n_read);
131 ib->n_read += sz;
133 return 0;
136 int ibuf_read_le8(struct ibuf *ib, uint8_t *v)
138 size_t sz = sizeof(*v);
140 if (ibuf_check_size(ib, sz))
141 return -1;
143 *v = read_at_le8(ib->b, ib->n_read);
144 ib->n_read += sz;
146 return 0;
149 int ibuf_read_le16(struct ibuf *ib, uint16_t *v)
151 size_t sz = sizeof(*v);
153 if (ibuf_check_size(ib, sz))
154 return -1;
156 *v = read_at_le16(ib->b, ib->n_read);
157 ib->n_read += sz;
159 return 0;
162 int ibuf_read_le32(struct ibuf *ib, uint32_t *v)
164 size_t sz = sizeof(*v);
166 if (ibuf_check_size(ib, sz))
167 return -1;
169 *v = read_at_le32(ib->b, ib->n_read);
170 ib->n_read += sz;
172 return 0;
175 int ibuf_read_le64(struct ibuf *ib, uint64_t *v)
177 size_t sz = sizeof(*v);
179 if (ibuf_check_size(ib, sz))
180 return -1;
182 *v = read_at_le64(ib->b, ib->n_read);
183 ib->n_read += sz;
185 return 0;
188 int ibuf_read_n8(struct ibuf *ib, uint8_t *v)
190 return ibuf_read(ib, v, sizeof(*v));
193 int ibuf_read_n16(struct ibuf *ib, uint16_t *v)
195 return ibuf_read(ib, v, sizeof(*v));
198 int ibuf_read_n32(struct ibuf *ib, uint32_t *v)
200 return ibuf_read(ib, v, sizeof(*v));
203 int ibuf_read_n64(struct ibuf *ib, uint64_t *v)
205 return ibuf_read(ib, v, sizeof(*v));
208 static int obuf_check_size(const struct obuf *ob, size_t sz)
210 if (obuf_remaining(ob) < sz)
211 return -1;
213 return 0;
216 void obuf_init(struct obuf *ob, void *b, size_t sz)
218 ob->b = b;
219 ob->n_written = 0;
220 ob->capacity = sz;
223 int obuf_splice(const struct obuf *src, struct obuf *dst, size_t off, size_t sz)
225 size_t end = off + sz;
226 size_t capacity = obuf_capacity(src);
227 size_t nr_written = obuf_nr_written(src);
229 if (end < off || end < sz || end > capacity)
230 return -1;
232 obuf_init(dst, &src->b[off], sz);
234 /* Handle previously written data in src. */
235 if (off < nr_written)
236 dst->n_written = nr_written - off;
238 return 0;
241 int obuf_splice_current(const struct obuf *src, struct obuf *dst, size_t sz)
243 return obuf_splice(src, dst, obuf_nr_written(src), sz);
246 int obuf_split(const struct obuf *src, struct obuf *a, struct obuf *b,
247 size_t boundary)
249 if (obuf_splice(src, a, 0, boundary))
250 return -1;
252 return obuf_splice(src, b, boundary, obuf_capacity(src) - boundary);
255 void *obuf_oob_fill(struct obuf *ob, size_t sz)
257 void *b;
259 if (obuf_check_size(ob, sz))
260 return NULL;
262 b = &ob->b[ob->n_written];
263 ob->n_written += sz;
265 return b;
268 int obuf_write(struct obuf *ob, const void *data, size_t sz)
270 void *b;
272 b = obuf_oob_fill(ob, sz);
273 if (b == NULL)
274 return -1;
276 memcpy(b, data, sz);
278 return 0;
281 int obuf_write_be8(struct obuf *ob, uint8_t v)
283 size_t sz = sizeof(v);
285 if (obuf_check_size(ob, sz))
286 return -1;
288 write_at_be8(ob->b, v, ob->n_written);
289 ob->n_written += sz;
291 return 0;
294 int obuf_write_be16(struct obuf *ob, uint16_t v)
296 size_t sz = sizeof(v);
298 if (obuf_check_size(ob, sz))
299 return -1;
301 write_at_be16(ob->b, v, ob->n_written);
302 ob->n_written += sz;
304 return 0;
307 int obuf_write_be32(struct obuf *ob, uint32_t v)
309 size_t sz = sizeof(v);
311 if (obuf_check_size(ob, sz))
312 return -1;
314 write_at_be32(ob->b, v, ob->n_written);
315 ob->n_written += sz;
317 return 0;
320 int obuf_write_be64(struct obuf *ob, uint64_t v)
322 size_t sz = sizeof(v);
324 if (obuf_check_size(ob, sz))
325 return -1;
327 write_at_be64(ob->b, v, ob->n_written);
328 ob->n_written += sz;
330 return 0;
333 int obuf_write_le8(struct obuf *ob, uint8_t v)
335 size_t sz = sizeof(v);
337 if (obuf_check_size(ob, sz))
338 return -1;
340 write_at_le8(ob->b, v, ob->n_written);
341 ob->n_written += sz;
343 return 0;
346 int obuf_write_le16(struct obuf *ob, uint16_t v)
348 size_t sz = sizeof(v);
350 if (obuf_check_size(ob, sz))
351 return -1;
353 write_at_le16(ob->b, v, ob->n_written);
354 ob->n_written += sz;
356 return 0;
359 int obuf_write_le32(struct obuf *ob, uint32_t v)
361 size_t sz = sizeof(v);
363 if (obuf_check_size(ob, sz))
364 return -1;
366 write_at_le32(ob->b, v, ob->n_written);
367 ob->n_written += sz;
369 return 0;
372 int obuf_write_le64(struct obuf *ob, uint64_t v)
374 size_t sz = sizeof(v);
376 if (obuf_check_size(ob, sz))
377 return -1;
379 write_at_le64(ob->b, v, ob->n_written);
380 ob->n_written += sz;
382 return 0;
385 int obuf_write_n8(struct obuf *ob, uint8_t v)
387 return obuf_write(ob, &v, sizeof(v));
390 int obuf_write_n16(struct obuf *ob, uint16_t v)
392 return obuf_write(ob, &v, sizeof(v));
395 int obuf_write_n32(struct obuf *ob, uint32_t v)
397 return obuf_write(ob, &v, sizeof(v));
400 int obuf_write_n64(struct obuf *ob, uint64_t v)
402 return obuf_write(ob, &v, sizeof(v));
405 const void *obuf_contents(const struct obuf *ob, size_t *sz)
407 *sz = obuf_nr_written(ob);
408 return ob->b;