55 lines
1.1 KiB
C
55 lines
1.1 KiB
C
/*
|
|
* Copyright © 2021, Keith Packard <keithp@keithp.com>
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#include "picolibc-hooks.h"
|
|
|
|
static LIBC_DATA int (*_stdout_hook)(int);
|
|
|
|
int z_impl_zephyr_fputc(int a, FILE *out)
|
|
{
|
|
(*_stdout_hook)(a);
|
|
return 0;
|
|
}
|
|
|
|
#ifdef CONFIG_USERSPACE
|
|
static inline int z_vrfy_zephyr_fputc(int c, FILE *stream)
|
|
{
|
|
return z_impl_zephyr_fputc(c, stream);
|
|
}
|
|
#include <zephyr/syscalls/zephyr_fputc_mrsh.c>
|
|
#endif
|
|
|
|
static int picolibc_put(char a, FILE *f)
|
|
{
|
|
zephyr_fputc(a, f);
|
|
return 0;
|
|
}
|
|
|
|
static LIBC_DATA FILE __stdout = FDEV_SETUP_STREAM(picolibc_put, NULL, NULL, 0);
|
|
static LIBC_DATA FILE __stdin = FDEV_SETUP_STREAM(NULL, NULL, NULL, 0);
|
|
|
|
#ifdef __strong_reference
|
|
#define STDIO_ALIAS(x) __strong_reference(stdout, x);
|
|
#else
|
|
#define STDIO_ALIAS(x) FILE *const x = &__stdout;
|
|
#endif
|
|
|
|
FILE *const stdin = &__stdin;
|
|
FILE *const stdout = &__stdout;
|
|
STDIO_ALIAS(stderr);
|
|
|
|
void __stdout_hook_install(int (*hook)(int))
|
|
{
|
|
_stdout_hook = hook;
|
|
__stdout.flags |= _FDEV_SETUP_WRITE;
|
|
}
|
|
|
|
void __stdin_hook_install(unsigned char (*hook)(void))
|
|
{
|
|
__stdin.get = (int (*)(FILE *)) hook;
|
|
__stdin.flags |= _FDEV_SETUP_READ;
|
|
}
|