From 9e439809c90f266db841a7c1bd35b41072921bf9 Mon Sep 17 00:00:00 2001 From: Laurent Mazet Date: Fri, 13 Jan 2023 17:50:48 +0100 Subject: [PATCH] partial append and insert commands --- hexdump.c | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 69 insertions(+), 7 deletions(-) diff --git a/hexdump.c b/hexdump.c index dd4ba73..d606a12 100644 --- a/hexdump.c +++ b/hexdump.c @@ -26,7 +26,7 @@ int nbcols = NBCOLS; int nbdigits = NBDIGITS; -int offset = 1; +int offset = 0; char buffer[BUFFERSIZE] = {0}; FILE *fin = NULL; @@ -183,6 +183,31 @@ int gotoaddr (unsigned long int addr) { return 1; } +/* insert sequence function */ + +int insertseq (sequence_t *seq) { + char buffer[BUFFERSIZE] = {0}; + + VERBOSE (DEBUG, printf ("insert (%d): '%s'\n", offset, seq->sequence); + int i; + for (i = 0; i < seq->length; i++) { + char c = seq->bytes[i]; + printf (" 0x%02x (%c)", c, ((c >= 32) && (c < 127)) ? c : '.'); + }; + printf ("\n")); + if (offset > 0) { + int nbread = fread (buffer, 1, offset, fin); + if (nbread != offset) { + return 1; + } + writefile (buffer, offset); + offset = 0; + } + writefile (seq->bytes, seq->length); + + return 0; +} + /* hexadecimal dump function */ int hexdump (int len) { @@ -237,7 +262,7 @@ int hexdump (int len) { /* parse octal string */ -unsigned long int octal (char *s, int n) { +long int octal (char *s, int n) { int i; unsigned long int l = 0; for (i = 0; i < n; i++) { @@ -252,7 +277,7 @@ unsigned long int octal (char *s, int n) { /* parse hexa string */ -unsigned long int hexa (char *s, int n) { +long int hexa (char *s, int n) { int i; unsigned long int l = 0; for (i = 0; i < n; i++) { @@ -328,7 +353,7 @@ int specialchar (char *s, char *b) { int main (int argc, char *argv[]) { - int rc = 0; + int i, rc = 0; char *input = NULL; char *output = NULL; char *commands = NULL; @@ -435,6 +460,7 @@ int main (int argc, char *argv[]) case '/': /* read patern */ seq.sequence = commands; + seq.length = 0; while (*commands) { if ((*commands == '\\') && ((commands[1] == '/') || (commands[1] == '\\'))) { @@ -465,6 +491,7 @@ int main (int argc, char *argv[]) rc = gotoaddr (addr); } else { VERBOSE (ERROR, fprintf (stderr, "erroneous address\n")); + rc = 1; } break; @@ -483,16 +510,51 @@ int main (int argc, char *argv[]) rc = gotoaddr (addr); } else { VERBOSE (ERROR, fprintf (stderr, "erroneous address\n")); + rc = 1; } break; case 'a': /* append mode */ - break; + offset = 0; + /* fall through */ - case 'd': /* delete mode */ + case 'i': /* insert mode */ + while (*commands) { + if ((*commands == ' ') || (*commands == '\t')) { + commands++; + } else { + break; + } + } + seq.sequence = commands; + seq.length = 0; + i = 0; + while (*commands) { + if ((*commands == ' ') || (*commands == '\t')) { + *commands++ = '\0'; + break; + } else { + commands++; + i++; + if (i % 2 == 0) { + seq.bytes[seq.length] = hexa (seq.sequence + 2 * seq.length, 2); + if (seq.bytes[seq.length] == -1) { + rc = 1; + break; + } + seq.length++; + } + } + } + if ((seq.length > 0) && (rc == 0)) { + rc = insertseq (&seq); + } else { + VERBOSE (ERROR, fprintf (stderr, "erroneous sequence '%s'\n", seq.sequence)); + rc = 1; + } break; - case 'i': /* insert mode */ + case 'd': /* delete mode */ break; case 'p': /* print mode */ -- 2.30.2