You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
54 lines
1.1 KiB
54 lines
1.1 KiB
/* |
|
* 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; |
|
}
|
|
|