Consolidate code doing '\n' -> '\n\r' compensation in DEBUG_LL and CONSOLE_* subsystems. While at it move it from puts_ll() to putc_ll() in order to match the semantics of other puts()/putc() implementations. This is done as a macro in order to avoid putting any restrictions on the signature of __putc. Signed-off-by: Andrey Smirnov <andrew.smirnov@xxxxxxxxx> --- include/debug_ll.h | 38 ++++++++++++++++++++++++++++++++------ lib/console.c | 17 +++++++---------- 2 files changed, 39 insertions(+), 16 deletions(-) diff --git a/include/debug_ll.h b/include/debug_ll.h index 504751639..4032ced95 100644 --- a/include/debug_ll.h +++ b/include/debug_ll.h @@ -31,9 +31,32 @@ #include <mach/debug_ll.h> #endif +/** + * __do_putc - Macro implementing '\n'-> '\n\r' substituting putc() + * + * @__putc: Single argument or a macro that implements plain putc() + * @__c: Character to print + * + * Internal macro used to implement putc_ll() and __console_putc() and + * intended to be the only place where '\n' -> '\n\r' substitution is + * codified + */ +#define __do_putc(__putc, ___c) \ + ({ \ + typeof(___c) __c = (___c); \ + int __n = 1; \ + \ + __putc(__c); \ + if (__c == '\n') { \ + __putc('\r'); \ + __n = 2; \ + } \ + __n; \ + }) + #if defined (CONFIG_DEBUG_LL) -static inline void putc_ll(char value) +static inline void __putc_ll(char value) { PUTC_LL(value); } @@ -45,10 +68,11 @@ static inline void puthex_ll(unsigned long value) for (i = sizeof(unsigned long) * 2; i--; ) { ch = ((value >> (i * 4)) & 0xf); ch += (ch >= 10) ? 'a' - 10 : '0'; - putc_ll(ch); + __putc_ll(ch); } } +static inline int putc_ll(char value); /* * Be careful with puts_ll, it only works if the binary is running at the * link address which often is not the case during early startup. If in doubt @@ -57,9 +81,6 @@ static inline void puthex_ll(unsigned long value) static inline void puts_ll(const char * str) { while (*str) { - if (*str == '\n') - putc_ll('\r'); - putc_ll(*str); str++; } @@ -67,7 +88,7 @@ static inline void puts_ll(const char * str) #else -static inline void putc_ll(char value) +static inline void __putc_ll(char value) { } @@ -86,4 +107,9 @@ static inline void puts_ll(const char * str) #endif +static inline int putc_ll(char value) +{ + return __do_putc(__putc_ll, value); +} + #endif /* __INCLUDE_DEBUG_LL_H__ */ diff --git a/lib/console.c b/lib/console.c index 12c0ae2de..f97deca97 100644 --- a/lib/console.c +++ b/lib/console.c @@ -134,16 +134,13 @@ void __cdev_putc(struct console_device *cdev, char c) */ int __console_putc(struct console_device *cdev, char c) { - int n = 0; - - __cdev_putc(cdev, c); - n++; - if (c == '\n') { - __cdev_putc(cdev, '\r'); - n++; - } - - return n; +/* + * __do_putc expects a macro or a function of a single argument so we + * create this dummy adapter to work around that + */ +#define __CDEV_PUTC(__c) __cdev_putc(cdev, __c) + + return __do_putc(__CDEV_PUTC, c); } /** -- 2.17.0 _______________________________________________ barebox mailing list barebox@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/barebox