// Copyright Microsoft and CHERIoT Contributors.
// SPDX-License-Identifier: MIT

#ifndef __STDIO_H__
#define __STDIO_H__

#include <cdefs.h>
#include <compartment-macros.h>
#include <stdarg.h>
#include <stddef.h>

#define PRT_MAX_SIZE (0x80)
#define EOF (-1)

__BEGIN_DECLS

/**
 * This is a very simple implementation of a subset of stdio and supports only
 * UARTs.  The Uart type is often a C++ template type and so we can't forward
 * declare it in a C header and so we use a volatile void* instead, which can
 * be cast to the correct type inside the library.
 */
typedef volatile void FILE;

#if DEVICE_EXISTS(uart0)
#	define stdout MMIO_CAPABILITY(void, uart0)
#	define stdin MMIO_CAPABILITY(void, uart0)
#elif DEVICE_EXISTS(uart)
#	define stdout MMIO_CAPABILITY(void, uart)
#	define stdin MMIO_CAPABILITY(void uart)
#else
#error No device found for stdout and stderr
#endif

#if DEVICE_EXISTS(uart1) && !STDERR_TO_STDOUT
#	define stderr MMIO_CAPABILITY(void, uart1)
#elif defined(stdout)
#	define stderr stdout
#else
#error No device found for stderr
#endif

int __cheri_libcall vfprintf(FILE *stream, const char *fmt, va_list ap);

static inline int fprintf(FILE *stream, const char *format, ...)
{
	va_list ap;

	va_start(ap, format);
	int ret = vfprintf(stream, format, ap);
	va_end(ap);
	return ret;
}

#ifdef stdout
static inline int printf(const char *format, ...)
{
	va_list ap;

	va_start(ap, format);
	int ret = vfprintf(stdout, format, ap);
	va_end(ap);
	return ret;
}
#endif

int __cheri_libcall snprintf(char *str, size_t size, const char *format, ...);
int __cheri_libcall vsnprintf(const char *str,
                              size_t      size,
                              const char *format,
                              va_list     ap);
__END_DECLS

#endif /* !__STDIO_H__ */
