Home | History | Annotate | Download | only in lib
      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 
     13 void 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 
     20 void *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 
     33 void *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 
     47 const 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 
     61 const 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