From 27b2633b7c50bb76bfe1333b628e1548ac6ca1d8 Mon Sep 17 00:00:00 2001 From: patacongo Date: Sat, 14 May 2011 18:14:51 +0000 Subject: Extend line buffering logic to puts, fputs, putc, fputc, and putchar() git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@3608 42af7a65-404d-4744-a932-0658087f49c3 --- nuttx/TODO | 18 +-------------- nuttx/lib/stdio/lib_fputc.c | 7 ++++-- nuttx/lib/stdio/lib_fputs.c | 53 ++++++++++++++++++++++++++++++++++----------- nuttx/lib/stdio/lib_puts.c | 16 +++++++------- 4 files changed, 54 insertions(+), 40 deletions(-) (limited to 'nuttx') diff --git a/nuttx/TODO b/nuttx/TODO index 7b05b97aa..25722f3f0 100644 --- a/nuttx/TODO +++ b/nuttx/TODO @@ -12,7 +12,7 @@ nuttx/ (5) Binary loaders (binfmt/) (15) Network (net/, drivers/net) (2) USB (drivers/usbdev, drivers/usbhost) - (6) Libraries (lib/) + (5) Libraries (lib/) (13) File system/Generic drivers (fs/, drivers/) (1) Graphics subystem (graphics/) (1) Pascal add-on (pcode/) @@ -371,22 +371,6 @@ o Libraries (lib/) Priority: Low (unless you are using mixed C-buffered I/O with fgets and fgetc, for example). - Description: if CONFIG_STDIO_LINEBUFFER is defined, then fputs() should flush - the buffer on each newline encountered in the input stream. At - present, it does not flush at all! This is because fputs() is - based on fwrite() which handles binary data. - - I suppose one could easily check if the last character is '\n' - and then flush in fputs() for that case. But that is imperfect - logic. It would work for the most frequent cases like puts("abcdef\n") - but not in all cases. For example, puts("abc\ndef") should flush - "abc\n" to output but keep "def" buffered. I can't get that behavior - using lib_fwrite() to implement fputs() (unless lib_fwrite were - extended to handle binary or text data with newlines). - Status: Open - Priority: Low (unless you doing lots of puts or fputs output and the - current buffer handling does not meet your needs). - Description: Need some minimal termios support... at a minimum, enough to switch between raw and "normal" modes to support behavior like that needed for readline(). diff --git a/nuttx/lib/stdio/lib_fputc.c b/nuttx/lib/stdio/lib_fputc.c index 34ef7aa25..917fcc10a 100644 --- a/nuttx/lib/stdio/lib_fputc.c +++ b/nuttx/lib/stdio/lib_fputc.c @@ -87,14 +87,17 @@ int fputc(int c, FAR FILE *stream) { unsigned char buf = (unsigned char)c; - if (lib_fwrite(&buf, 1, stream) > 0) + int ret; + + ret = lib_fwrite(&buf, 1, stream); + if (ret > 0) { /* Flush the buffer if a newline is output */ #ifdef CONFIG_STDIO_LINEBUFFER if (c == '\n') { - int ret = lib_fflush(stream, true); + ret = lib_fflush(stream, true); if (ret < 0) { return EOF; diff --git a/nuttx/lib/stdio/lib_fputs.c b/nuttx/lib/stdio/lib_fputs.c index a956c83b2..ddb548925 100644 --- a/nuttx/lib/stdio/lib_fputs.c +++ b/nuttx/lib/stdio/lib_fputs.c @@ -93,35 +93,62 @@ int fputs(FAR const char *s, FAR FILE *stream) { int ntowrite; - int nwritten; - int nput = EOF; + int nput; + int ret; /* Make sure that a string was provided. */ +#ifdef CONFIG_DEBUG /* Most parameter checking is disabled if DEBUG is off */ if (!s) { set_errno(EINVAL); + return EOF; } - else +#endif + + /* Get the length of the string. */ + + ntowrite = strlen(s); + if (ntowrite == 0) { - /* Get the length of the string. */ + return 0; + } + + /* Write the string */ - ntowrite = strlen(s); - if (ntowrite == 0) +#ifdef CONFIG_STDIO_LINEBUFFER + nput = ntowrite; + while (ntowrite-- > 0) + { + ret = lib_fwrite(s, 1, stream); + if (ret <= 0) { - nput = 0; + return EOF; } - else - { - /* Write the string */ - nwritten = lib_fwrite(s, ntowrite, stream); - if (nwritten > 0) + /* Flush the buffer if a newline was put to the buffer */ + + if (*s == '\n') + { + ret = lib_fflush(stream, true); + if (ret < 0) { - nput = nwritten; + return EOF; } } + + /* Set up for the next lib_fwrite() */ + + s++; } return nput; +#else + nput = lib_fwrite(s, ntowrite, stream); + if (nput < 0) + { + return EOF + } + return nput; +#endif } diff --git a/nuttx/lib/stdio/lib_puts.c b/nuttx/lib/stdio/lib_puts.c index e8cb186f6..088d0f043 100644 --- a/nuttx/lib/stdio/lib_puts.c +++ b/nuttx/lib/stdio/lib_puts.c @@ -93,6 +93,7 @@ int puts(FAR const char *s) FILE *stream = stdout; int nwritten; int nput = EOF; + int ret; /* Write the string (the next two steps must be atomic) */ @@ -106,20 +107,19 @@ int puts(FAR const char *s) /* Followed by a newline */ char newline = '\n'; - if (lib_fwrite(&newline, 1, stream) > 0) + ret = lib_fwrite(&newline, 1, stream); + if (ret > 0) { nput = nwritten + 1; /* Flush the buffer after the newline is output */ #ifdef CONFIG_STDIO_LINEBUFFER - { - int ret = lib_fflush(stream, true); - if (ret < 0) - { - nput = EOF; - } - } + ret = lib_fflush(stream, true); + if (ret < 0) + { + nput = EOF; + } #endif } } -- cgit v1.2.3