cleaning
[hexdump.git] / hexdump.c
index d7faa681edc25e61ebbfecf5fa85882b471297b2..02814449497c964194fcbd51abc6f53e08e42c1d 100644 (file)
--- a/hexdump.c
+++ b/hexdump.c
@@ -59,7 +59,7 @@ int usage (int ret)
     fprintf (fd, "commands: [/hstr/|addr|+nb] [a hstr] [d nb|-] [i hstr] [p nb|-] [s/h1/h2/[g]]\n");
     fprintf (fd, " addr: move to address (0... octal, [1-9]... deci, 0x... hexa)\n");
     fprintf (fd, " +nb: move to offset (0... octal, [1-9]... deci, 0x... hexa)\n");
-    fprintf (fd, " //: move to hexa stringi hstr\n");
+    fprintf (fd, " //: move to hexa string hstr\n");
     fprintf (fd, " a : append hexa string hstr to current address\n");
     fprintf (fd, " d : delete nb bytes (- until end file)\n");
     fprintf (fd, " i : insert hexa string hstr to current address\n");
@@ -87,7 +87,7 @@ void printline (char *buffer, int nb, unsigned long int addr) {
 
     printf ("0x%0*lx:", nbdigits, addr);
     for (i = 0; i < nb; i++) {
-        printf (" %02x", buffer[i]);
+        printf (" %02x", (unsigned char)buffer[i]);
     }
     for (i = nb; i < nbcols; i++) {
         printf ("   ");
@@ -149,7 +149,7 @@ int searchseq (sequence_t *seq) {
             offset = seq->length;
             addrfile += i;
             fseek (fin, i - nb, SEEK_CUR);
-            VERBOSE (DEBUG, printf ("found sequence (%d)\n", i - nb));
+            VERBOSE (DEBUG, printf ("found sequence at 0x%0*lx\n", getnbdigits (addrfile), addrfile));
             return 0;
         }
     }
@@ -270,7 +270,7 @@ long int octal (char *s, int n) {
     int i;
     unsigned long int l = 0;
     for (i = 0; i < n; i++) {
-        if ((s[i] >= '0') && (s[i] <= '9')) {
+        if ((s[i] >= '0') && (s[i] < '8')) {
             l = l * 8 + s[i] - '0';
         } else {
             return -1;
@@ -331,23 +331,27 @@ int specialchar (char *s, char *b) {
         case '2':
         case '3':
             l = octal (s + i + 1, 3);
-            if (l != -1) {
-                i += 4;
+            if (l == -1) {
+                VERBOSE (WARNING, fprintf (stderr, "incorrect special char (\\%c%c%c)\n", s[i + 1], s[i + 2], s[i + 3]));
             }
+            i += 4;
             break;
         case 'x':
             l = hexa (s + i + 2, 2);
-            if (l != -1) {
-                i += 4;
+            if (l == -1) {
+                VERBOSE (WARNING, fprintf (stderr, "incorrect special char (\\x%c%c)\n", s[i + 2], s[i + 3]));
             }
+            i += 4;
             break;
         default:
+            VERBOSE (WARNING, fprintf (stderr, "incorrect special char (\\%c)\n", s[i + 1]));
+            i += 2;
             break;
         }
         if (l != -1) {
             VERBOSE (DEBUG, printf("l: 0x%02x '%c'\n", l, l));
+            b[j++] = l;
         }
-        b[j++] = (l != -1) ? l : s[i++];
     }
 
     return j;
@@ -482,8 +486,15 @@ int main (int argc, char *argv[])
         case 'e':
             arg = (arg[2]) ? arg + 2 : (--argc > 0) ? *(++argv) : NULL;
             if (arg) {
-                commands = (commands == NULL) ? arg :
-                    strcat (strcat (commands, " "), arg);
+                //commands = (commands == NULL) ? arg :
+                //    strcat (strcat (commands, " "), arg);
+                if (commands == NULL) {
+                    commands = arg;
+                } else {
+                    char *tmp = (char *) malloc (strlen (arg) + 1);
+                    strcat (strcat (commands, " "), strcpy (tmp, arg));
+                    free (tmp);
+                }
             }
             break;
         case 'i':
@@ -515,14 +526,13 @@ int main (int argc, char *argv[])
     }
 
     /* check input */
+    fin = stdin;
     if (input) {
         fin = fopen (input, "rb");
         if (!fin) {
             VERBOSE (ERROR, fprintf (stderr, "error: can't open file '%s'\n", input));
             return 1;
         }
-    } else {
-        fin = stdin;
     }
 
     /* check output */
@@ -564,7 +574,7 @@ int main (int argc, char *argv[])
                         VERBOSE (ERROR, fprintf (stderr, "can't find pattern '%s'\n", seq.sequence));
                     }
                 } else {
-                    VERBOSE (ERROR, fprintf (stderr, "erroneous pattern '%s'\n", seq.sequence));
+                    VERBOSE (ERROR, fprintf (stderr, "erroneous pattern \"%s'\n", seq.sequence));
                 }
                 break;
 
@@ -598,11 +608,16 @@ int main (int argc, char *argv[])
             case '9': /* read address */
                 commands--;
                 addr = strtol (commands, &commands, 10);
-                rc = gotoaddr (addr);
-                if (rc == 1) {
-                    VERBOSE (ERROR, fprintf (stderr, "can't find address (0x%0*lx)\n", getnbdigits (addr), addr));
+                if ((*commands != 0) && (*commands != ' ')) {
+                    VERBOSE (ERROR, fprintf (stderr, "erroneous address ()\n"));
+                    rc = 1;
+                } else {
+                    rc = gotoaddr (addr);
+                    if (rc == 1) {
+                        VERBOSE (ERROR, fprintf (stderr, "can't find address (0x%0*lx)\n", getnbdigits (addr), addr));
+                    }
+                    offset = 0;
                 }
-                offset = 0;
                 break;
 
             case 'a': /* append mode */
@@ -614,6 +629,9 @@ int main (int argc, char *argv[])
                 rc = gethexaseq (&seq, commands, &commands);
                 if (rc == 0) {
                     rc = insertseq (&seq);
+                    if (rc == 1) {
+                        VERBOSE (ERROR, fprintf (stderr, "can't jump (%d)\n", offset));
+                    }
                 } else {
                     VERBOSE (ERROR, fprintf (stderr, "erroneous sequence '%s'\n", seq.sequence));
                 }
@@ -654,14 +672,19 @@ int main (int argc, char *argv[])
 
             case 's': /* substitute mode */
                 if (*commands == '/') {
-                    rc = getpattern (&seq, commands, &commands);
+                    rc = getpattern (&seq, ++commands, &commands);
                     if (rc == 0) {
                         rc = searchseq (&seq);
                         if (rc == 0) {
                             fseek (fin, offset, SEEK_CUR);
                             rc = gethexaseq (&seq, commands, &commands);
+                            commands++;
                             if (rc == 0) {
+                                offset = 0;
                                 rc = insertseq (&seq);
+                                if (rc == 1) {
+                                    VERBOSE (ERROR, fprintf (stderr, "can't jump (%d)\n", offset));
+                                }
                             } else {
                                 VERBOSE (ERROR, fprintf (stderr, "erroneous sequence '%s'\n", seq.sequence));
                             }
@@ -671,6 +694,9 @@ int main (int argc, char *argv[])
                     } else {
                         VERBOSE (ERROR, fprintf (stderr, "erroneous pattern '%s'\n", seq.sequence));
                     }
+                } else {
+                    VERBOSE (ERROR, fprintf (stderr, "erroneous sequence '%s'\n", seq.sequence));
+                    rc = 1;
                 }
                 offset = 0;
                 break;
@@ -710,9 +736,11 @@ int main (int argc, char *argv[])
 // test: hexdump.exe -i hexdump.c -o ko/test.c 2>&1 | grep -q "can't open file"
 // test: cat hexdump.c | hexdump.exe -n 3 | head -2 | tail -1 | grep -q '0x000003: 64 65 70  dep'
 // test: hexdump.exe -i hexdump.c -n 3 | head -2 | tail -1 | grep -q '0x0003: 64 65 70  dep'
+// test: hexdump.exe -i hexdump.c -v 3 -n 8 | grep -q 'no command'
 // test: hexdump.exe -i hexdump.c -o test.c -e 'p 200' | tail -1 | grep -q '0x00c0:'
 // test: cmp hexdump.c test.c; x=$?; rm test.c; test x$x = x0
-// test: hexdump.exe -i hexdump.c -e ' /cflags/ p 17 /debug/ p 8' | grep -q '0x0019: 2a 2f 0a 2f 2a 20 6c 69  \*\/\./\* li'
+// test: hexdump.exe -i hexdump.c -n 8 -e ' /cflags/ p 17 /debug/ p 8' | grep -q '0x0019: 2a 2f 0a 2f 2a 20 6c 69  \*\/\./\* li'
+// test: hexdump.exe -i hexdump.c -e ' /\099\411\xgg\y/' 2>&1 | grep -c 'incorrect special char' | xargs test 4 -eq
 // test: hexdump.exe -i hexdump.c -o test.c -e ' /cfl\x61gs/ p 16 /d\145bug/ p 8' | grep -q '0x0027: 64 65 62 75 67 2e 6f 20  debug.o'
 // test: cmp hexdump.c test.c; x=$?; rm test.c; test x$x = x0
 // test: hexdump.exe -i hexdump.c -e ' /\n/ p 8' | grep -q '0x000d: 0a 2f 2a 20 63 66 6c 61  \./\* cfla'
@@ -721,16 +749,30 @@ int main (int argc, char *argv[])
 // test: hexdump.exe -i hexdump.c -v 3 -e " /\'/" -e ' /\"/' -e ' /\\/' -e ' /\x2a/' -e ' /\x3A/' | grep l: | wc -l | xargs test 5 =
 // test: hexdump.exe -i hexdump.c -e ' /\n\/* vim:/ p -' | grep -q ': 74 3a 20 2a 2f 0a *t: \*\/\.'
 // test: hexdump.exe -i hexdump.c -e 'p go_to_end' 2>&1 | grep -q 'unknown length'
+// test: hexdump.exe -i hexdump.c -e ' /\x41BCD/' 2>&1 | grep -q "can't find pattern"
 // test: hexdump.exe -i hexdump.c -e ' //' 2>&1 | grep -q 'erroneous pattern'
 // test: hexdump.exe -i hexdump.c -e 'foo' 2>&1 | grep -q 'unknown command'
 // test: hexdump.exe -i hexdump.c -e '0x20 p 8 64 p 8 0200 p 16' | grep -q '0x0080:'
+// test: hexdump.exe -i hexdump.c -e '07777777' 2>&1 | grep -q "can't find address"
+// test: hexdump.exe -i hexdump.c -e '0xFFFFFF' 2>&1 | grep -q "can't find address"
+// test: hexdump.exe -i hexdump.c -e '99999999' 2>&1 | grep -q "can't find address"
+// test: hexdump.exe -i hexdump.c -e '+9999999' 2>&1 | grep -q "can't find address"
+// test: hexdump.exe -i hexdump.c -e '09' 2>&1 | grep -q 'erroneous address'
 // test: hexdump.exe -i hexdump.c -e '0xg' 2>&1 | grep -q 'erroneous address'
+// test: hexdump.exe -i hexdump.c -e '1a' 2>&1 | grep -q 'erroneous address'
 // test: hexdump.exe -i hexdump.c -o test.c -e ' /cflags/ a 414e5a /link/ i 2F333B'
-// test: grep -q ANZcflags test.c && grep -q 'link/3;er' test.c; x=$?; rm test.c; test x$x = x0
-// test: hexdump.exe -i hexdump.c -e ' /cflags/ a 414e5' 2>&1 | grep 'erroneous sequence'
+// test: grep -q '[A]NZcflags' test.c && grep -q '[l]ink/3;er' test.c; x=$?; rm test.c; test x$x = x0
+// test: hexdump.exe -i hexdump.c -e ' /cflags/ a 414e5' 2>&1 | grep -q 'erroneous sequence'
 // test: hexdump.exe -i hexdump.c -o test.c -e ' /lags/ d 2'
-// test: grep -q cfgs test.c; x=$?; rm test.c; test x$x = x0
+// test: grep -q '[c]fgs' test.c; x=$?; rm test.c; test x$x = x0
 // test: hexdump.exe -i hexdump.c -o test.c -e ' /lags/ +2 i 2041'
-// test: grep -q 'cf Ags' test.c; x=$?; rm test.c; test x$x = x0
+// test: grep -q '[c]fla Ags:' test.c; x=$?; rm test.c; test x$x = x0
+// test: hexdump.exe -i hexdump.c -o test.c -e ' s/lags/2041/'
+// test: grep -q '[c]f A:' test.c; x=$?; rm test.c; test x$x = x0
+// test: hexdump.exe -i hexdump.c -e ' s' 2>&1 | grep -q 'erroneous sequence'
+// test: hexdump.exe -i hexdump.c -e ' s//' 2>&1 | grep -q 'erroneous pattern'
+// test: hexdump.exe -i hexdump.c -e ' s/\x41BCD/2041/' 2>&1 | grep -q "can't find pattern"
+// test: hexdump.exe -i hexdump.c -e ' s/cflags/414e5/' 2>&1 | grep -q 'erroneous sequence'
+// test: hexdump.exe -i hexdump.exe | grep -q 'ffff'; test x$? = x1
 
 /* vim: set ts=4 sw=4 et: */