|  | /* | 
|  | * Copyright (c) 2018 Oticon A/S | 
|  | * Copyright (c) 2023 Nordic Semiconductor ASA | 
|  | * | 
|  | * SPDX-License-Identifier: Apache-2.0 | 
|  | */ | 
|  |  | 
|  | #include <zephyr/init.h> | 
|  | #include <zephyr/arch/posix/posix_trace.h> | 
|  | #include <zephyr/sys/printk-hooks.h> | 
|  | #include <zephyr/sys/libc-hooks.h> | 
|  |  | 
|  | #define _STDOUT_BUF_SIZE 256 | 
|  | static char stdout_buff[_STDOUT_BUF_SIZE]; | 
|  | static int n_pend; /* Number of pending characters in buffer */ | 
|  |  | 
|  | static int print_char(int c) | 
|  | { | 
|  | int printnow = 0; | 
|  |  | 
|  | if ((c != '\n') && (c != '\r')) { | 
|  | stdout_buff[n_pend++] = c; | 
|  | stdout_buff[n_pend] = 0; | 
|  | } else { | 
|  | printnow = 1; | 
|  | } | 
|  |  | 
|  | if (n_pend >= _STDOUT_BUF_SIZE - 1) { | 
|  | printnow = 1; | 
|  | } | 
|  |  | 
|  | if (printnow) { | 
|  | posix_print_trace("%s\n", stdout_buff); | 
|  | n_pend = 0; | 
|  | stdout_buff[0] = 0; | 
|  | } | 
|  | return c; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Ensure that whatever was written thru printk is displayed now | 
|  | */ | 
|  | void posix_flush_stdout(void) | 
|  | { | 
|  | if (n_pend) { | 
|  | stdout_buff[n_pend] = 0; | 
|  | posix_print_trace("%s", stdout_buff); | 
|  | n_pend = 0; | 
|  | stdout_buff[0] = 0; | 
|  | } | 
|  | } | 
|  |  | 
|  | static int posix_arch_console_init(void) | 
|  | { | 
|  | #ifdef CONFIG_PRINTK | 
|  | __printk_hook_install(print_char); | 
|  | #endif | 
|  | #ifdef CONFIG_STDOUT_CONSOLE | 
|  | __stdout_hook_install(print_char); | 
|  | #endif | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | SYS_INIT(posix_arch_console_init, PRE_KERNEL_1, | 
|  | CONFIG_POSIX_ARCH_CONSOLE_INIT_PRIORITY); |