 /*
 * This file is part of the libpayload project.
 *
 * Copyright (C) 2014 Imagination Technologies
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; version 2 of the License.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
 */

#include <stdint.h>
#include "string.h"

/*
 * Alternative string functions to the default ones are added
 * because there is no guarantee that the provided source and
 * destination addresses are properly aligned;
 * The default string functions work with multiple of 4 bytes
 * (sizeof(unsinged long)); MIPS will use LW/SW instructions
 * for these operations and if the source and destination
 * addresses are not aligned it will trigger an exception.
 */

void *memcpy(void *dest, const void *src, size_t n)
{
	u8 *ptr_d = dest;
	const u8 *ptr_s = src;
	size_t i;

	for (i = 0; i < n; i++)
		*ptr_d++ = *ptr_s++;

	return dest;
}

void *memmove(void *dest, const void *src, size_t n)
{
	if ((src < dest) && (dest - src < n)) {
		u8 *ptr_d = dest;
		const u8 *ptr_s = src;

		/* copy backwards */
		while (n--)
			ptr_d[n] = ptr_s[n];

		return dest;
	}

	/* copy forwards */
	return memcpy(dest, src, n);
}

void *memset(void *s, int c, size_t n)
{
	u8 *ptr = s;
	size_t i;

	for (i = 0; i < n; i++)
		*ptr++ = c;

	return s;
}

int memcmp(const void *s1, const void *s2, size_t n)
{
	size_t i;

	for (i = 0; i < n; i++)
		if (((u8 *)s1)[i] != ((u8 *)s2)[i])
			return ((u8 *)s1)[i] - ((u8 *)s2)[i];
	return 0;
}
