/* Copyright 2020 The Fuchsia Authors. All rights reserved.
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */

#include <common.h>
#include <libavb/avb_sysdeps.h>
#include <malloc.h>

int avb_memcmp(const void *src1, const void *src2, size_t n)
{
	return memcmp(src1, src2, n);
}

void *avb_memcpy(void *dest, const void *src, size_t n)
{
	return memcpy(dest, src, n);
}

void *avb_memset(void *dest, const int c, size_t n)
{
	return memset(dest, c, n);
}

int avb_strcmp(const char *s1, const char *s2)
{
	return strcmp(s1, s2);
}

int avb_strncmp(const char *s1, const char *s2, size_t n)
{
	return strncmp(s1, s2, n);
}

size_t avb_strlen(const char *str)
{
	return strlen(str);
}

void avb_abort(void)
{
	panic("avb_abort!");
}

void avb_print(const char *message)
{
	printf("%s", message);
}

void avb_printv(const char *message, ...)
{
	va_list ap;
	const char *m;

	va_start(ap, message);
	for (m = message; m != NULL; m = va_arg(ap, const char *)) {
		printf("%s", m);
	}
	va_end(ap);
}

void *avb_malloc_(size_t size)
{
	return malloc(size);
}

void avb_free(void *ptr)
{
	free(ptr);
}

uint32_t avb_div_by_10(uint64_t *dividend)
{
	uint32_t rem = (uint32_t)(*dividend % 10);
	*dividend /= 10;
	return rem;
}
