Module: xenomai-2.6 Branch: master Commit: 21f3f3c8cdc9088d604280d35066d5c1cb71f382 URL: http://git.xenomai.org/?p=xenomai-2.6.git;a=commit;h=21f3f3c8cdc9088d604280d35066d5c1cb71f382
Author: Gilles Chanteperdrix <gilles.chanteperd...@xenomai.org> Date: Sun Apr 15 19:39:35 2012 +0200 rt_print: add support for fputc and putchar --- include/posix/stdio.h | 4 ++++ include/rtdk.h | 2 ++ src/skins/common/rt_print.c | 26 ++++++++++++++++++++++---- src/skins/posix/posix.wrappers | 2 ++ src/skins/posix/printf.c | 30 +++++++++++++++++++++++++++++- src/skins/posix/wrappers.c | 12 ++++++++++++ 6 files changed, 71 insertions(+), 5 deletions(-) diff --git a/include/posix/stdio.h b/include/posix/stdio.h index 6af0129..37d21cd 100644 --- a/include/posix/stdio.h +++ b/include/posix/stdio.h @@ -23,6 +23,10 @@ int __real_puts(const char *s); int __real_fputs(const char *s, FILE *stream); +int __real_fputc(int c, FILE *stream); + +int __real_putchar(int c); + size_t __real_fwrite(const void *ptr, size_t sz, size_t nmemb, FILE *stream); #ifdef __cplusplus diff --git a/include/rtdk.h b/include/rtdk.h index e1fc3b4..bf43716 100644 --- a/include/rtdk.h +++ b/include/rtdk.h @@ -54,6 +54,8 @@ int rt_fprintf(FILE *stream, const char *format, ...); int rt_printf(const char *format, ...); int rt_puts(const char *s); int rt_fputs(const char *s, FILE *stream); +int rt_fputc(int c, FILE *stream); +int rt_putchar(int c); size_t rt_fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream); void rt_syslog(int priority, const char *format, ...); void rt_vsyslog(int priority, const char *format, va_list args); diff --git a/src/skins/common/rt_print.c b/src/skins/common/rt_print.c index 8d0b9cd..a9fce78 100644 --- a/src/skins/common/rt_print.c +++ b/src/skins/common/rt_print.c @@ -274,17 +274,35 @@ int rt_printf(const char *format, ...) int rt_fputs(const char *s, FILE *stream) { + return print_to_buffer(stream, 0, RT_PRINT_MODE_FWRITE, strlen(s), s); +} + +int rt_puts(const char *s) +{ int res; - res = print_to_buffer(stream, 0, RT_PRINT_MODE_FWRITE, strlen(s), s); + res = rt_fputs(s, stdout); if (res < 0) return res; - return print_to_buffer(stream, 0, RT_PRINT_MODE_FWRITE, 1, "\n"); + + return print_to_buffer(stdout, 0, RT_PRINT_MODE_FWRITE, 1, "\n"); } -int rt_puts(const char *s) +int rt_fputc(int c, FILE *stream) +{ + unsigned char uc = c; + int rc; + + rc = print_to_buffer(stream, 0, RT_PRINT_MODE_FWRITE, 1, (char *)&uc); + if (rc < 0) + return EOF; + + return (int)uc; +} + +int rt_putchar(int c) { - return rt_fputs(s, stdout); + return rt_fputc(c, stdout); } size_t rt_fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream) diff --git a/src/skins/posix/posix.wrappers b/src/skins/posix/posix.wrappers index a7a6b50..9833077 100644 --- a/src/skins/posix/posix.wrappers +++ b/src/skins/posix/posix.wrappers @@ -95,6 +95,8 @@ --wrap printf --wrap puts --wrap fputs +--wrap fputc +--wrap putchar --wrap fwrite --wrap syslog --wrap vsyslog diff --git a/src/skins/posix/printf.c b/src/skins/posix/printf.c index 99587d7..396a8e0 100644 --- a/src/skins/posix/printf.c +++ b/src/skins/posix/printf.c @@ -56,7 +56,35 @@ int __wrap_fputs(const char *s, FILE *stream) int __wrap_puts(const char *s) { - return __wrap_fputs(s, stdout); + if (unlikely(xeno_get_current() != XN_NO_HANDLE && + !(xeno_get_current_mode() & XNRELAX))) + return rt_puts(s); + else { + rt_print_flush_buffers(); + return __real_puts(s); + } +} + +int __wrap_fputc(int c, FILE *stream) +{ + if (unlikely(xeno_get_current() != XN_NO_HANDLE && + !(xeno_get_current_mode() & XNRELAX))) + return rt_fputc(c, stream); + else { + rt_print_flush_buffers(); + return __real_fputc(c, stream); + } +} + +int __wrap_putchar(int c) +{ + if (unlikely(xeno_get_current() != XN_NO_HANDLE && + !(xeno_get_current_mode() & XNRELAX))) + return rt_putchar(c); + else { + rt_print_flush_buffers(); + return __real_putchar(c); + } } size_t __wrap_fwrite(void *ptr, size_t size, size_t nmemb, FILE *stream) diff --git a/src/skins/posix/wrappers.c b/src/skins/posix/wrappers.c index bdedcb7..8d3fd7e 100644 --- a/src/skins/posix/wrappers.c +++ b/src/skins/posix/wrappers.c @@ -365,6 +365,18 @@ int __real_fputs(const char *s, FILE *stream) } __attribute__ ((weak)) +int __real_fputc(int c, FILE *stream) +{ + return fputc(c, stream); +} + +__attribute__ ((weak)) +int __real_putchar(int c) +{ + return putchar(c); +} + +__attribute__ ((weak)) size_t __real_fwrite(const void *ptr, size_t sz, size_t nmemb, FILE *stream) { return fwrite(ptr, sz, nmemb, stream); _______________________________________________ Xenomai-git mailing list Xenomai-git@gna.org https://mail.gna.org/listinfo/xenomai-git