mirror of
https://github.com/flipperdevices/flipperzero-firmware.git
synced 2025-12-12 04:41:26 +04:00
[FL-3927] FuriThread stdin (#3979)
* feat: FuriThread stdin * ci: fix f18 * feat: stdio callback context Co-authored-by: Georgii Surkov <37121527+gsurkov@users.noreply.github.com> Co-authored-by: あく <alleteam@gmail.com>
This commit is contained in:
@@ -44,18 +44,24 @@ wrapped_fn_list = [
|
||||
"vsiprintf",
|
||||
"vsniprintf",
|
||||
#
|
||||
# Scanf is not implemented 4 now
|
||||
# standard input
|
||||
#
|
||||
"fgetc",
|
||||
"getc",
|
||||
"getchar",
|
||||
"fgets",
|
||||
"ungetc",
|
||||
#
|
||||
# standard input, but unimplemented
|
||||
#
|
||||
"gets",
|
||||
#
|
||||
# scanf, not implemented for now
|
||||
#
|
||||
# "fscanf",
|
||||
# "scanf",
|
||||
# "sscanf",
|
||||
# "vsprintf",
|
||||
# "fgetc",
|
||||
# "fgets",
|
||||
# "getc",
|
||||
# "getchar",
|
||||
# "gets",
|
||||
# "ungetc",
|
||||
# "vfscanf",
|
||||
# "vscanf",
|
||||
# "vsscanf",
|
||||
|
||||
@@ -51,11 +51,54 @@ int __wrap_snprintf(char* str, size_t size, const char* format, ...) {
|
||||
}
|
||||
|
||||
int __wrap_fflush(FILE* stream) {
|
||||
UNUSED(stream);
|
||||
furi_thread_stdout_flush();
|
||||
if(stream == stdout) furi_thread_stdout_flush();
|
||||
return 0;
|
||||
}
|
||||
|
||||
int __wrap_fgetc(FILE* stream) {
|
||||
if(stream != stdin) return EOF;
|
||||
char c;
|
||||
if(furi_thread_stdin_read(&c, 1, FuriWaitForever) == 0) return EOF;
|
||||
return c;
|
||||
}
|
||||
|
||||
int __wrap_getc(FILE* stream) {
|
||||
return __wrap_fgetc(stream);
|
||||
}
|
||||
|
||||
int __wrap_getchar(void) {
|
||||
return __wrap_fgetc(stdin);
|
||||
}
|
||||
|
||||
char* __wrap_fgets(char* str, size_t n, FILE* stream) {
|
||||
// leave space for the zero terminator
|
||||
furi_check(n >= 1);
|
||||
n--;
|
||||
|
||||
if(stream != stdin) {
|
||||
*str = '\0';
|
||||
return str;
|
||||
}
|
||||
|
||||
// read characters
|
||||
int c;
|
||||
do {
|
||||
c = __wrap_fgetc(stdin);
|
||||
if(c > 0) *(str++) = c;
|
||||
} while(c != EOF && c != '\n' && --n);
|
||||
|
||||
// place zero terminator
|
||||
*str = '\0';
|
||||
return str;
|
||||
}
|
||||
|
||||
int __wrap_ungetc(int ch, FILE* stream) {
|
||||
char c = ch;
|
||||
if(stream != stdin) return EOF;
|
||||
furi_thread_stdin_unread(&c, 1);
|
||||
return ch;
|
||||
}
|
||||
|
||||
__attribute__((__noreturn__)) void __wrap___assert(const char* file, int line, const char* e) {
|
||||
UNUSED(file);
|
||||
UNUSED(line);
|
||||
|
||||
@@ -16,6 +16,12 @@ int __wrap_putc(int ch, FILE* stream);
|
||||
int __wrap_snprintf(char* str, size_t size, const char* format, ...);
|
||||
int __wrap_fflush(FILE* stream);
|
||||
|
||||
int __wrap_fgetc(FILE* stream);
|
||||
int __wrap_getc(FILE* stream);
|
||||
int __wrap_getchar(void);
|
||||
char* __wrap_fgets(char* str, size_t n, FILE* stream);
|
||||
int __wrap_ungetc(int ch, FILE* stream);
|
||||
|
||||
__attribute__((__noreturn__)) void __wrap___assert(const char* file, int line, const char* e);
|
||||
|
||||
__attribute__((__noreturn__)) void
|
||||
|
||||
Reference in New Issue
Block a user