You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2021/12/01 04:06:12 UTC
[incubator-nuttx-apps] 01/02: system/readline: Make it work without CONFIG_FILE_STREAM
This is an automated email from the ASF dual-hosted git repository.
xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx-apps.git
commit c8439368ac3af3852118ed212f587335eca36743
Author: Xiang Xiao <xi...@xiaomi.com>
AuthorDate: Sat Nov 13 22:18:04 2021 +0800
system/readline: Make it work without CONFIG_FILE_STREAM
Signed-off-by: Xiang Xiao <xi...@xiaomi.com>
---
include/system/readline.h | 30 +++--
system/readline/Makefile | 2 +-
system/readline/readline.c | 185 +-------------------------
system/readline/{readline.c => readline_fd.c} | 49 ++-----
4 files changed, 41 insertions(+), 225 deletions(-)
diff --git a/include/system/readline.h b/include/system/readline.h
index f99c891..7db0f89 100644
--- a/include/system/readline.h
+++ b/include/system/readline.h
@@ -143,26 +143,26 @@ FAR const struct extmatch_vtable_s *
#endif
/****************************************************************************
- * Name: readline
+ * Name: readline_fd
*
- * readline() reads in at most one less than 'buflen' characters from
- * 'instream' and stores them into the buffer pointed to by 'buf'.
- * Characters are echoed on 'outstream'. Reading stops after an EOF or a
+ * readline_fd() reads in at most one less than 'buflen' characters from
+ * 'infd' and stores them into the buffer pointed to by 'buf'.
+ * Characters are echoed on 'outfd'. Reading stops after an EOF or a
* newline. If a newline is read, it is stored into the buffer. A null
* terminator is stored after the last character in the buffer.
*
- * This version of realine assumes that we are reading and writing to
- * a VT100 console. This will not work well if 'instream' or 'outstream'
+ * This version of readline_fd assumes that we are reading and writing to
+ * a VT100 console. This will not work well if 'infd' or 'outfd'
* corresponds to a raw byte steam.
*
* This function is inspired by the GNU readline but is an entirely
* different creature.
*
* Input Parameters:
- * buf - The user allocated buffer to be filled.
- * buflen - the size of the buffer.
- * instream - The stream to read characters from
- * outstream - The stream to each characters to.
+ * buf - The user allocated buffer to be filled.
+ * buflen - the size of the buffer.
+ * infd - The file to read characters from
+ * outfd - The file to each characters to.
*
* Returned values:
* On success, the (positive) number of bytes transferred is returned.
@@ -171,6 +171,16 @@ FAR const struct extmatch_vtable_s *
*
****************************************************************************/
+ssize_t readline_fd(FAR char *buf, int buflen, int infd, int outfd);
+
+/****************************************************************************
+ * Name: readline
+ *
+ * readline() is same to readline_fd() but accept a file stream instead
+ * of a file handle.
+ *
+ ****************************************************************************/
+
#ifdef CONFIG_FILE_STREAM
ssize_t readline(FAR char *buf, int buflen, FILE *instream, FILE *outstream);
#endif
diff --git a/system/readline/Makefile b/system/readline/Makefile
index 7d457f7..2e9af64 100644
--- a/system/readline/Makefile
+++ b/system/readline/Makefile
@@ -22,6 +22,6 @@ include $(APPDIR)/Make.defs
# The Readline Library
-CSRCS = readline.c readline_common.c
+CSRCS = readline.c readline_fd.c readline_common.c
include $(APPDIR)/Application.mk
diff --git a/system/readline/readline.c b/system/readline/readline.c
index 47b345d..8f263c2 100644
--- a/system/readline/readline.c
+++ b/system/readline/readline.c
@@ -24,151 +24,10 @@
#include <nuttx/config.h>
-#include <sys/types.h>
#include <stdio.h>
-#include <unistd.h>
-#include <errno.h>
#include <assert.h>
#include "system/readline.h"
-#include "readline.h"
-
-/****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-/****************************************************************************
- * Private Type Declarations
- ****************************************************************************/
-
-struct readline_s
-{
- struct rl_common_s vtbl;
- int infd;
-#ifdef CONFIG_READLINE_ECHO
- int outfd;
-#endif
-};
-
-/****************************************************************************
- * Private Function Prototypes
- ****************************************************************************/
-
-/****************************************************************************
- * Public Data
- ****************************************************************************/
-
-/****************************************************************************
- * Private Data
- ****************************************************************************/
-
-/****************************************************************************
- * Private Functions
- ****************************************************************************/
-
-/****************************************************************************
- * Name: readline_getc
- ****************************************************************************/
-
-static int readline_getc(FAR struct rl_common_s *vtbl)
-{
- FAR struct readline_s *priv = (FAR struct readline_s *)vtbl;
- char buffer;
- ssize_t nread;
-
- DEBUGASSERT(priv);
-
- /* Loop until we successfully read a character (or until an unexpected
- * error occurs).
- */
-
- do
- {
- /* Read one character from the incoming stream */
-
- nread = read(priv->infd, &buffer, 1);
-
- /* Check for end-of-file. */
-
- if (nread == 0)
- {
- /* Return EOF on end-of-file */
-
- return EOF;
- }
-
- /* Check if an error occurred */
-
- else if (nread < 0)
- {
- /* EINTR is not really an error; it simply means that a signal was
- * received while waiting for input.
- */
-
- int errcode = errno;
- if (errcode != EINTR)
- {
- /* Return EOF on any errors that we cannot handle */
-
- return EOF;
- }
- }
- }
- while (nread < 1);
-
- /* On success, return the character that was read */
-
- return (int)buffer;
-}
-
-/****************************************************************************
- * Name: readline_putc
- ****************************************************************************/
-
-#ifdef CONFIG_READLINE_ECHO
-static void readline_putc(FAR struct rl_common_s *vtbl, int ch)
-{
- FAR struct readline_s *priv = (FAR struct readline_s *)vtbl;
- char buffer = ch;
- ssize_t nwritten;
-
- DEBUGASSERT(priv);
-
- /* Loop until we successfully write a character (or until an unexpected
- * error occurs).
- */
-
- do
- {
- /* Write the character to the outgoing stream */
-
- nwritten = write(priv->outfd, &buffer, 1);
-
- /* Check for irrecoverable write errors. */
-
- if (nwritten < 0 && errno != EINTR)
- {
- break;
- }
- }
- while (nwritten < 1);
-}
-#endif
-
-/****************************************************************************
- * Name: readline_write
- ****************************************************************************/
-
-#ifdef CONFIG_READLINE_ECHO
-static void readline_write(FAR struct rl_common_s *vtbl,
- FAR const char *buffer, size_t buflen)
-{
- FAR struct readline_s *priv = (FAR struct readline_s *)vtbl;
- DEBUGASSERT(priv && buffer && buflen > 0);
-
- write(priv->outfd, buffer, buflen);
-}
-#endif
/****************************************************************************
* Public Functions
@@ -177,52 +36,20 @@ static void readline_write(FAR struct rl_common_s *vtbl,
/****************************************************************************
* Name: readline
*
- * readline() reads in at most one less than 'buflen' characters from
- * 'instream' and stores them into the buffer pointed to by 'buf'.
- * Characters are echoed on 'outstream'. Reading stops after an EOF or a
- * newline. If a newline is read, it is stored into the buffer. A null
- * terminator is stored after the last character in the buffer.
- *
- * This version of realine assumes that we are reading and writing to
- * a VT100 console. This will not work well if 'instream' or 'outstream'
- * corresponds to a raw byte steam.
- *
- * This function is inspired by the GNU readline but is an entirely
- * different creature.
- *
- * Input Parameters:
- * buf - The user allocated buffer to be filled.
- * buflen - the size of the buffer.
- * instream - The stream to read characters from
- * outstream - The stream to each characters to.
- *
- * Returned values:
- * On success, the (positive) number of bytes transferred is returned.
- * EOF is returned to indicate either an end of file condition or a
- * failure.
+ * readline() is same to readline_fd() but accept a file stream instead
+ * of a file handle.
*
****************************************************************************/
+#ifdef CONFIG_FILE_STREAM
ssize_t readline(FAR char *buf, int buflen, FILE *instream, FILE *outstream)
{
- struct readline_s vtbl;
-
/* Sanity checks */
DEBUGASSERT(instream && outstream);
- /* Set up the vtbl structure */
-
- vtbl.vtbl.rl_getc = readline_getc;
- vtbl.infd = instream->fs_fd;
+ /* Let readline_fd do the work */
-#ifdef CONFIG_READLINE_ECHO
- vtbl.vtbl.rl_putc = readline_putc;
- vtbl.vtbl.rl_write = readline_write;
- vtbl.outfd = outstream->fs_fd;
-#endif
-
- /* The let the common readline logic do the work */
-
- return readline_common(&vtbl.vtbl, buf, buflen);
+ return readline_fd(buf, buflen, instream->fs_fd, outstream->fs_fd);
}
+#endif
diff --git a/system/readline/readline.c b/system/readline/readline_fd.c
similarity index 77%
copy from system/readline/readline.c
copy to system/readline/readline_fd.c
index 47b345d..6d134f0 100644
--- a/system/readline/readline.c
+++ b/system/readline/readline_fd.c
@@ -1,5 +1,5 @@
/****************************************************************************
- * apps/system/readline/readline.c
+ * apps/system/readline/readline_fd.c
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
@@ -25,7 +25,6 @@
#include <nuttx/config.h>
#include <sys/types.h>
-#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <assert.h>
@@ -34,10 +33,6 @@
#include "readline.h"
/****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-/****************************************************************************
* Private Type Declarations
****************************************************************************/
@@ -51,18 +46,6 @@ struct readline_s
};
/****************************************************************************
- * Private Function Prototypes
- ****************************************************************************/
-
-/****************************************************************************
- * Public Data
- ****************************************************************************/
-
-/****************************************************************************
- * Private Data
- ****************************************************************************/
-
-/****************************************************************************
* Private Functions
****************************************************************************/
@@ -175,26 +158,26 @@ static void readline_write(FAR struct rl_common_s *vtbl,
****************************************************************************/
/****************************************************************************
- * Name: readline
+ * Name: readline_fd
*
- * readline() reads in at most one less than 'buflen' characters from
- * 'instream' and stores them into the buffer pointed to by 'buf'.
- * Characters are echoed on 'outstream'. Reading stops after an EOF or a
+ * readline_fd() reads in at most one less than 'buflen' characters from
+ * 'infd' and stores them into the buffer pointed to by 'buf'.
+ * Characters are echoed on 'outfd'. Reading stops after an EOF or a
* newline. If a newline is read, it is stored into the buffer. A null
* terminator is stored after the last character in the buffer.
*
- * This version of realine assumes that we are reading and writing to
- * a VT100 console. This will not work well if 'instream' or 'outstream'
+ * This version of readline_fd assumes that we are reading and writing to
+ * a VT100 console. This will not work well if 'infd' or 'outfd'
* corresponds to a raw byte steam.
*
* This function is inspired by the GNU readline but is an entirely
* different creature.
*
* Input Parameters:
- * buf - The user allocated buffer to be filled.
- * buflen - the size of the buffer.
- * instream - The stream to read characters from
- * outstream - The stream to each characters to.
+ * buf - The user allocated buffer to be filled.
+ * buflen - the size of the buffer.
+ * infd - The file to read characters from
+ * outfd - The file to each characters to.
*
* Returned values:
* On success, the (positive) number of bytes transferred is returned.
@@ -203,23 +186,19 @@ static void readline_write(FAR struct rl_common_s *vtbl,
*
****************************************************************************/
-ssize_t readline(FAR char *buf, int buflen, FILE *instream, FILE *outstream)
+ssize_t readline_fd(FAR char *buf, int buflen, int infd, int outfd)
{
struct readline_s vtbl;
- /* Sanity checks */
-
- DEBUGASSERT(instream && outstream);
-
/* Set up the vtbl structure */
vtbl.vtbl.rl_getc = readline_getc;
- vtbl.infd = instream->fs_fd;
+ vtbl.infd = infd;
#ifdef CONFIG_READLINE_ECHO
vtbl.vtbl.rl_putc = readline_putc;
vtbl.vtbl.rl_write = readline_write;
- vtbl.outfd = outstream->fs_fd;
+ vtbl.outfd = outfd;
#endif
/* The let the common readline logic do the work */