/* * Copyright © 2021, Keith Packard * * 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 #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; }