1/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
2 * Use of this source code is governed by a BSD-style license that can be
3 * found in the LICENSE file.
4 *
5 * Implementations of stateful memory operations.
6 */
7
8#include "sysincludes.h"
9
10#include "stateful_util.h"
11#include "utility.h"
12
13void StatefulInit(MemcpyState *state, void *buf, uint64_t len)
14{
15	state->remaining_buf = buf;
16	state->remaining_len = len;
17	state->overrun = 0;
18}
19
20void *StatefulSkip(MemcpyState *state, uint64_t len)
21{
22	if (state->overrun)
23		return NULL;
24	if (len > state->remaining_len) {
25		state->overrun = 1;
26		return NULL;
27	}
28	state->remaining_buf += len;
29	state->remaining_len -= len;
30	return state; /* Must return something non-NULL. */
31}
32
33void *StatefulMemcpy(MemcpyState *state, void *dst, uint64_t len)
34{
35	if (state->overrun)
36		return NULL;
37	if (len > state->remaining_len) {
38		state->overrun = 1;
39		return NULL;
40	}
41	Memcpy(dst, state->remaining_buf, len);
42	state->remaining_buf += len;
43	state->remaining_len -= len;
44	return dst;
45}
46
47const void *StatefulMemcpy_r(MemcpyState *state, const void *src, uint64_t len)
48{
49	if (state->overrun)
50		return NULL;
51	if (len > state->remaining_len) {
52		state->overrun = 1;
53		return NULL;
54	}
55	Memcpy(state->remaining_buf, src, len);
56	state->remaining_buf += len;
57	state->remaining_len -= len;
58	return src;
59}
60
61const void *StatefulMemset_r(MemcpyState *state, const uint8_t val,
62			     uint64_t len)
63{
64	if (state->overrun)
65		return NULL;
66	if (len > state->remaining_len) {
67		state->overrun = 1;
68		return NULL;
69	}
70	Memset(state->remaining_buf, val, len);
71	state->remaining_buf += len;
72	state->remaining_len -= len;
73	return state; /* Must return something non-NULL. */
74}
75