partial append and insert commands
authorLaurent Mazet <laurent.mazet@thalesgroup.com>
Fri, 13 Jan 2023 16:50:48 +0000 (17:50 +0100)
committerLaurent Mazet <laurent.mazet@thalesgroup.com>
Fri, 13 Jan 2023 16:50:48 +0000 (17:50 +0100)
hexdump.c

index dd4ba734d24fa68bdb38ddd1c5ff397f7fb50fc5..d606a121ac3ee4b8263b4a236200e19d29fbbf81 100644 (file)
--- 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 */