From 2330dcc49aeba1cb100827dcc0cf9c23bac874a8 Mon Sep 17 00:00:00 2001 From: Christopher Haster Date: Tue, 7 Jun 2016 10:08:07 -0500 Subject: [PATCH] Added newline conversion for stdin stdin converts the following character sequences: \n -> \n \r\n -> \n \r -> \n \n\r -> \n For original behaviour, a serial object can be instantiated explicitly --- hal/common/retarget.cpp | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/hal/common/retarget.cpp b/hal/common/retarget.cpp index 35695770ca..54181ad598 100644 --- a/hal/common/retarget.cpp +++ b/hal/common/retarget.cpp @@ -88,7 +88,8 @@ FileHandle::~FileHandle() { #if DEVICE_SERIAL extern int stdio_uart_inited; extern serial_t stdio_uart; -static char stdio_prev; +static char stdio_in_prev; +static char stdio_out_prev; #endif static void init_serial() { @@ -228,11 +229,11 @@ extern "C" int PREFIX(_write)(FILEHANDLE fh, const unsigned char *buffer, unsign #if DEVICE_SERIAL if (!stdio_uart_inited) init_serial(); for (unsigned int i = 0; i < length; i++) { - if (buffer[i] == '\n' && stdio_prev != '\r') { + if (buffer[i] == '\n' && stdio_out_prev != '\r') { serial_putc(&stdio_uart, '\r'); } serial_putc(&stdio_uart, buffer[i]); - stdio_prev = buffer[i]; + stdio_out_prev = buffer[i]; } #endif n = length; @@ -259,7 +260,24 @@ extern "C" int PREFIX(_read)(FILEHANDLE fh, unsigned char *buffer, unsigned int // only read a character at a time from stdin #if DEVICE_SERIAL if (!stdio_uart_inited) init_serial(); - *buffer = serial_getc(&stdio_uart); + while (true) { + char c = serial_getc(&stdio_uart); + if ((c == '\r' && stdio_in_prev != '\n') || + (c == '\n' && stdio_in_prev != '\r')) { + stdio_in_prev = c; + *buffer = '\n'; + break; + } else if ((c == '\r' && stdio_in_prev == '\n') || + (c == '\n' && stdio_in_prev == '\r')) { + stdio_in_prev = c; + // onto next character + continue; + } else { + stdio_in_prev = c; + *buffer = c; + break; + } + } #endif n = 1; } else {