From 74b09330889957987003e7a372daacfad2653a15 Mon Sep 17 00:00:00 2001 From: Gregory Nutt Date: Fri, 1 Nov 2013 07:15:14 -0600 Subject: [PATCH] Add skip= and count= options to the NSH hexdump command. From Ken Pettit --- ChangeLog.txt | 2 + nshlib/Kconfig | 4 ++ nshlib/nsh_dbgcmds.c | 124 ++++++++++++++++++++++++++++++++++--------- nshlib/nsh_parse.c | 4 ++ 4 files changed, 109 insertions(+), 25 deletions(-) diff --git a/ChangeLog.txt b/ChangeLog.txt index f47c1b082..949ae7414 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -716,4 +716,6 @@ (2013-10-30). * apps/platform/mikroe-stm32f4: Now supports storage of configuration data. From Ken Pettit (2013-10-30). + * apps/nshlib/nsh_dbgcmds.c and others: Add skip= and count= + options to the hexdump command. From Ken Pettit (2013-11-1). diff --git a/nshlib/Kconfig b/nshlib/Kconfig index dcff7cf58..b549a6c2a 100644 --- a/nshlib/Kconfig +++ b/nshlib/Kconfig @@ -238,6 +238,10 @@ config NSH_CODECS_BUFSIZE int "File buffer size used by CODEC commands" default 128 +config NSH_CMDOPT_HEXDUMP + bool "hexdump: Enable 'skip' and 'count' parameters" + default n + endmenu config NSH_FILEIOSIZE diff --git a/nshlib/nsh_dbgcmds.c b/nshlib/nsh_dbgcmds.c index 85a4ccb9c..4b8646ef7 100644 --- a/nshlib/nsh_dbgcmds.c +++ b/nshlib/nsh_dbgcmds.c @@ -369,10 +369,16 @@ int cmd_hexdump(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv) { uint8_t buffer[IOBUFFERSIZE]; char msg[32]; - int position; + off_t position; int fd; int ret = OK; - +#ifdef CONFIG_NSH_CMDOPT_HEXDUMP + off_t skip = 0; + off_t count = 0xfffffff; + off_t dumpbytes; + int x; +#endif + /* Open the file for reading */ fd = open(argv[1], O_RDONLY); @@ -381,33 +387,101 @@ int cmd_hexdump(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv) nsh_output(vtbl, g_fmtcmdfailed, "hexdump", "open", NSH_ERRNO); return ERROR; } - + +#ifdef CONFIG_NSH_CMDOPT_HEXDUMP + for (x = 2; x < argc; x++) + { + if (strncmp(argv[x], "skip=", 5) == 0) + { + skip = atoi(&argv[x][5]); + } + else if (strncmp(argv[x], "count=", 6) == 0) + { + count = atoi(&argv[x][6]); + } + } +#endif + position = 0; for (;;) - { - int nbytesread = read(fd, buffer, IOBUFFERSIZE); + { + int nbytesread = read(fd, buffer, IOBUFFERSIZE); - /* Check for read errors */ + /* Check for read errors */ + + if (nbytesread < 0) + { + int errval = errno; + nsh_output(vtbl, g_fmtcmdfailed, "hexdump", "read", + NSH_ERRNO_OF(errval)); + ret = ERROR; + break; + } + else if (nbytesread > 0) + { +#ifdef CONFIG_NSH_CMDOPT_HEXDUMP + if (position < skip) + { + /* Skip bytes until we reach the skip point */ + + position += nbytesread; + if (position > skip) + { + dumpbytes = position - skip; + if (dumpbytes > count) + { + dumpbytes = count; + } + + snprintf(msg, sizeof(msg), "%s at %08x", argv[1], skip); + nsh_dumpbuffer(vtbl, msg, + &buffer[nbytesread - (position-skip)], + dumpbytes); + + if (count > dumpbytes) + { + count -= dumpbytes; + } + else + { + break; + } + } + + /* Don't print if we are in skip mode */ + + continue; + } + + /* Limit dumpbuffer to count if less than a full buffer needed */ + + if (nbytesread > count) + { + nbytesread = count; + } +#endif + + snprintf(msg, sizeof(msg), "%s at %08x", argv[1], position); + nsh_dumpbuffer(vtbl, msg, buffer, nbytesread); + position += nbytesread; + +#ifdef CONFIG_NSH_CMDOPT_HEXDUMP + if (count > nbytesread) + { + count -= nbytesread; + } + else + { + break; + } +#endif + } + else + { + break; // EOF + } + } - if (nbytesread < 0) - { - int errval = errno; - nsh_output(vtbl, g_fmtcmdfailed, "hexdump", "read", NSH_ERRNO_OF(errval)); - ret = ERROR; - break; - } - else if (nbytesread > 0) - { - snprintf(msg, sizeof(msg), "%s at %08x", argv[1], position); - nsh_dumpbuffer(vtbl, msg, buffer, nbytesread); - position += nbytesread; - } - else - { - break; // EOF - } - } - (void)close(fd); return ret; } diff --git a/nshlib/nsh_parse.c b/nshlib/nsh_parse.c index b293f4983..a58d0b03a 100644 --- a/nshlib/nsh_parse.c +++ b/nshlib/nsh_parse.c @@ -245,7 +245,11 @@ static const struct cmdmap_s g_cmdmap[] = #if CONFIG_NFILE_DESCRIPTORS > 0 #ifndef CONFIG_NSH_DISABLE_HEXDUMP +#ifndef CONFIG_NSH_CMDOPT_HEXDUMP { "hexdump", cmd_hexdump, 2, 2, "" }, +#else + { "hexdump", cmd_hexdump, 2, 4, " [skip=] [count=]" }, +#endif #endif #endif