| /* Copyright (c) 2013 The Chromium OS Authors. All rights reserved. |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| * |
| * Implementations of stateful memory operations. |
| */ |
| |
| #include "sysincludes.h" |
| |
| #include "stateful_util.h" |
| #include "utility.h" |
| |
| void StatefulInit(MemcpyState *state, void *buf, uint64_t len) |
| { |
| state->remaining_buf = buf; |
| state->remaining_len = len; |
| state->overrun = 0; |
| } |
| |
| void *StatefulSkip(MemcpyState *state, uint64_t len) |
| { |
| if (state->overrun) |
| return NULL; |
| if (len > state->remaining_len) { |
| state->overrun = 1; |
| return NULL; |
| } |
| state->remaining_buf += len; |
| state->remaining_len -= len; |
| return state; /* Must return something non-NULL. */ |
| } |
| |
| void *StatefulMemcpy(MemcpyState *state, void *dst, uint64_t len) |
| { |
| if (state->overrun) |
| return NULL; |
| if (len > state->remaining_len) { |
| state->overrun = 1; |
| return NULL; |
| } |
| Memcpy(dst, state->remaining_buf, len); |
| state->remaining_buf += len; |
| state->remaining_len -= len; |
| return dst; |
| } |
| |
| const void *StatefulMemcpy_r(MemcpyState *state, const void *src, uint64_t len) |
| { |
| if (state->overrun) |
| return NULL; |
| if (len > state->remaining_len) { |
| state->overrun = 1; |
| return NULL; |
| } |
| Memcpy(state->remaining_buf, src, len); |
| state->remaining_buf += len; |
| state->remaining_len -= len; |
| return src; |
| } |
| |
| const void *StatefulMemset_r(MemcpyState *state, const uint8_t val, |
| uint64_t len) |
| { |
| if (state->overrun) |
| return NULL; |
| if (len > state->remaining_len) { |
| state->overrun = 1; |
| return NULL; |
| } |
| Memset(state->remaining_buf, val, len); |
| state->remaining_buf += len; |
| state->remaining_len -= len; |
| return state; /* Must return something non-NULL. */ |
| } |