diff options
author | Gregory Nutt <gnutt@nuttx.org> | 2013-11-01 07:15:14 -0600 |
---|---|---|
committer | Gregory Nutt <gnutt@nuttx.org> | 2013-11-01 07:15:14 -0600 |
commit | 8148ce2957824b783b7ec81919b891f220c0237f (patch) | |
tree | 87a3f75d9eb988361cac0d8bd35771e9268b85de /apps/nshlib/nsh_dbgcmds.c | |
parent | b6814d7a4a44f58992704e2b85502ccc5dd0e331 (diff) | |
download | px4-nuttx-8148ce2957824b783b7ec81919b891f220c0237f.tar.gz px4-nuttx-8148ce2957824b783b7ec81919b891f220c0237f.tar.bz2 px4-nuttx-8148ce2957824b783b7ec81919b891f220c0237f.zip |
Add skip= and count= options to the NSH hexdump command. From Ken Pettit
Diffstat (limited to 'apps/nshlib/nsh_dbgcmds.c')
-rw-r--r-- | apps/nshlib/nsh_dbgcmds.c | 128 |
1 files changed, 101 insertions, 27 deletions
diff --git a/apps/nshlib/nsh_dbgcmds.c b/apps/nshlib/nsh_dbgcmds.c index 85a4ccb9c..4b8646ef7 100644 --- a/apps/nshlib/nsh_dbgcmds.c +++ b/apps/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); - - /* 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) - { - snprintf(msg, sizeof(msg), "%s at %08x", argv[1], position); - nsh_dumpbuffer(vtbl, msg, buffer, nbytesread); - position += nbytesread; - } - else - { - break; // EOF - } - } - + { + int nbytesread = read(fd, buffer, IOBUFFERSIZE); + + /* 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 + } + } + (void)close(fd); return ret; } |