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

Reply via email to