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.git
The following commit(s) were added to refs/heads/master by this push: new 4ee39f6e9a libc: add lib_dump utils 4ee39f6e9a is described below commit 4ee39f6e9a8d0446a962d76dc6b8fc87f322ac6a Author: chengkai <cheng...@xiaomi.com> AuthorDate: Tue Jul 19 22:07:10 2022 +0800 libc: add lib_dump utils Signed-off-by: chengkai <cheng...@xiaomi.com> --- include/debug.h | 30 ++++++++++++++ libs/libc/misc/lib_dumpbuffer.c | 39 ++++++++++++++++++ libs/libc/misc/lib_dumpvbuffer.c | 86 +++++++++++++++++++++++++++++++++++++--- 3 files changed, 149 insertions(+), 6 deletions(-) diff --git a/include/debug.h b/include/debug.h index 610531582b..f81b82b34e 100644 --- a/include/debug.h +++ b/include/debug.h @@ -1071,6 +1071,26 @@ extern "C" { #endif +/* Type of the call out function pointer provided to + * lib_dumphandler() or lib_dumpvhandler() + */ + +typedef CODE void (*lib_dump_handler_t)(FAR void *arg, + FAR const char *fmt, ...) + printflike(2, 3); + +/* Dump a buffer of data with handler */ + +void lib_dumphandler(FAR const char *msg, FAR const uint8_t *buffer, + unsigned int buflen, lib_dump_handler_t handler, + FAR void *arg); + +/* Do a pretty buffer dump from multiple buffers with handler. */ + +void lib_dumpvhandler(FAR const char *msg, FAR const struct iovec *iov, + int iovcnt, lib_dump_handler_t handler, + FAR void *arg); + /* Dump a buffer of data */ void lib_dumpbuffer(FAR const char *msg, FAR const uint8_t *buffer, @@ -1081,6 +1101,16 @@ void lib_dumpbuffer(FAR const char *msg, FAR const uint8_t *buffer, void lib_dumpvbuffer(FAR const char *msg, FAR const struct iovec *iov, int iovcnt); +/* Dump a buffer of data with fd */ + +void lib_dumpfile(int fd, FAR const char *msg, FAR const uint8_t *buffer, + unsigned int buflen); + +/* Do a pretty buffer dump from multiple buffers with fd. */ + +void lib_dumpvfile(int fd, FAR const char *msg, FAR const struct iovec *iov, + int iovcnt); + /* The system logging interfaces are normally accessed via the macros * provided above. If the cross-compiler's C pre-processor supports a * variable number of macro arguments, then those macros below will map all diff --git a/libs/libc/misc/lib_dumpbuffer.c b/libs/libc/misc/lib_dumpbuffer.c index db23cbf9b7..6c38377796 100644 --- a/libs/libc/misc/lib_dumpbuffer.c +++ b/libs/libc/misc/lib_dumpbuffer.c @@ -32,6 +32,26 @@ * Public Functions ****************************************************************************/ +/**************************************************************************** + * Name: lib_dumphandler + * + * Description: + * Do a pretty buffer dump with handler output. + * + ****************************************************************************/ + +void lib_dumphandler(FAR const char *msg, FAR const uint8_t *buffer, + unsigned int buflen, lib_dump_handler_t handler, + FAR void *arg) +{ + struct iovec buf; + + buf.iov_base = (FAR void *)buffer; + buf.iov_len = buflen; + + lib_dumpvhandler(msg, &buf, 1, handler, arg); +} + /**************************************************************************** * Name: lib_dumpbuffer * @@ -53,3 +73,22 @@ void lib_dumpbuffer(FAR const char *msg, FAR const uint8_t *buffer, lib_dumpvbuffer(msg, &buf, 1); } + +/**************************************************************************** + * Name: lib_dumpfile + * + * Description: + * Do a pretty buffer dump with fd output. + * + ****************************************************************************/ + +void lib_dumpfile(int fd, FAR const char *msg, FAR const uint8_t *buffer, + unsigned int buflen) +{ + struct iovec buf; + + buf.iov_base = (FAR void *)buffer; + buf.iov_len = buflen; + + lib_dumpvfile(fd, msg, &buf, 1); +} diff --git a/libs/libc/misc/lib_dumpvbuffer.c b/libs/libc/misc/lib_dumpvbuffer.c index 47b35d4938..b52d2c2866 100644 --- a/libs/libc/misc/lib_dumpvbuffer.c +++ b/libs/libc/misc/lib_dumpvbuffer.c @@ -28,6 +28,7 @@ #include <string.h> #include <stdint.h> #include <debug.h> +#include <stdio.h> /**************************************************************************** * Pre-processor definitions @@ -66,23 +67,61 @@ static char lib_nibble(unsigned char nibble) } } +/**************************************************************************** + * Name: lib_dumpvbuffer_handler + * + * Description: + * Do a pretty buffer dump from multiple buffers with syslog output. + * + ****************************************************************************/ + +static void lib_dumpvbuffer_handler(FAR void *arg, FAR const char *fmt, + ...) +{ + va_list ap; + + va_start(ap, fmt); + vsyslog(LOG_INFO, fmt, ap); + va_end(ap); +} + +/**************************************************************************** + * Name: lib_dumpvfile_handler + * + * Description: + * Do a pretty buffer dump from multiple buffers with file output. + * + ****************************************************************************/ + +static void lib_dumpvfile_handler(FAR void *arg, FAR const char *fmt, + ...) +{ + va_list ap; + int *fd = (int *)arg; + + va_start(ap, fmt); + vdprintf(*fd, fmt, ap); + va_end(ap); +} + /**************************************************************************** * Public Functions ****************************************************************************/ /**************************************************************************** - * Name: lib_dumpvbuffer + * Name: lib_dumpvhandler * * Description: - * Do a pretty buffer dump from multiple buffers. + * Do a pretty buffer dump from multiple buffers with handler output. * * A fairly large on-stack buffer is used for the case where timestamps are * applied to each line. * ****************************************************************************/ -void lib_dumpvbuffer(FAR const char *msg, FAR const struct iovec *iov, - int iovcnt) +void lib_dumpvhandler(FAR const char *msg, FAR const struct iovec *iov, + int iovcnt, lib_dump_handler_t handler, + FAR void *arg) { FAR const struct iovec *piov = iov; unsigned int len = 0; @@ -91,9 +130,14 @@ void lib_dumpvbuffer(FAR const char *msg, FAR const struct iovec *iov, unsigned int i = 0; FAR char *ptr; + if (!handler) + { + return; + } + if (msg) { - syslog(LOG_INFO, "%s (%p):\n", msg, iov->iov_base); + (*handler)(arg, "%s (%p):\n", msg, iov->iov_base); } /* Initialize the separator and terminator */ @@ -137,6 +181,36 @@ void lib_dumpvbuffer(FAR const char *msg, FAR const struct iovec *iov, } } - syslog(LOG_INFO, "%04x %s\n", i++ * _NITEMS, line); + (*handler)(arg, "%04x %s\n", i++ * _NITEMS, line); } } + +/**************************************************************************** + * Name: lib_dumpvbuffer + * + * Description: + * Do a pretty buffer dump from multiple buffers with + * lib_dumpvbuffer_handler output. + * + ****************************************************************************/ + +void lib_dumpvbuffer(FAR const char *msg, FAR const struct iovec *iov, + int iovcnt) +{ + lib_dumpvhandler(msg, iov, iovcnt, lib_dumpvbuffer_handler, NULL); +} + +/**************************************************************************** + * Name: lib_dumpvfile + * + * Description: + * Do a pretty buffer dump from multiple buffers with lib_dumpvfile_handler + * output. + * + ****************************************************************************/ + +void lib_dumpvfile(int fd, FAR const char *msg, FAR const struct iovec *iov, + int iovcnt) +{ + lib_dumpvhandler(msg, iov, iovcnt, lib_dumpvfile_handler, &fd); +}