code cleaning
authorLaurent Mazet <laurent.mazet@thalesgroup.com>
Thu, 12 Jan 2023 08:42:18 +0000 (09:42 +0100)
committerLaurent Mazet <laurent.mazet@thalesgroup.com>
Thu, 12 Jan 2023 08:42:18 +0000 (09:42 +0100)
hexdump.c

index c146b63797a4bd65a3c514a6da8db929d43240ee..d118c066a904cc22691f5c856f896093fe48bfd9 100644 (file)
--- a/hexdump.c
+++ b/hexdump.c
@@ -204,6 +204,41 @@ int hexdump (int len) {
     return 0;
 }
 
+/* parse octal string */
+
+long int octal (char *s, int n) {
+    int i;
+    long int l = 0;
+    for (i = 0; i < n; i++) {
+        if ((s[i] >= '0') && (s[i] <= '9')) {
+            l = l * 8 + s[i] - '0';
+        } else {
+            return -1;
+        }
+    }
+    return l;
+}
+
+/* parse hexa string */
+
+long int hexa (char *s, int n) {
+    int i;
+    long int l = 0;
+    for (i = 0; i < n; i++) {
+        l *= 16;
+        if ((s[i] >= '0') && (s[i] <= '9')) {
+            l += s[i] - '0';
+        } else if ((s[i] >= 'A') && (s[i] <= 'F')) {
+            l += s[i] + 10 - 'A';
+        } else if ((s[i] >= 'a') && (s[i] <= 'f')) {
+            l += s[i] + 10 - 'a';
+        } else {
+            return -1;
+        }
+    }
+    return l;
+}
+
 /* special character function */
 
 char *specialchar (char *s) {
@@ -214,7 +249,7 @@ char *specialchar (char *s) {
             continue;
         }
 
-        int l = 0;
+        int l = -1;
         switch (s[i + 1]) {
         case 'a': l = 0x07; i += 2; break;
         case 'b': l = 0x08; i += 2; break;
@@ -231,38 +266,21 @@ char *specialchar (char *s) {
         case '1':
         case '2':
         case '3':
-            if ((s[i + 2] >= '0') && (s[i + 2] <= '9') &&
-                (s[i + 3] >= '0') && (s[i + 3] <= '9')) {
-                l = (s[i + 1] - '0') * 8 * 8 + (s[i + 2] - '0') * 8 + s[i + 3] - '0';
+            l = octal (s + 1, 3);
+            if (l != -1) {
                 i += 4;
             }
             break;
         case 'x':
-            if ((((s[i + 2] >= '0') && (s[i + 2] <= '9')) ||
-                 ((s[i + 2] >= 'A') && (s[i + 2] <= 'F')) ||
-                 ((s[i + 2] >= 'a') && (s[i + 2] <= 'f'))) &&
-                (((s[i + 3] >= '0') && (s[i + 3] <= '9')) ||
-                 ((s[i + 3] >= 'A') && (s[i + 3] <= 'F')) ||
-                 ((s[i + 3] >= 'a') && (s[i + 3] <= 'f')))) {
-                l = s[i + 2] - '0';
-                if (s[i + 2] >= 'a') {
-                    l += '0' + 10 - 'a';
-                } else if (s[i + 2] >= 'A') {
-                    l += '0' + 10 - 'A';
-                }
-                l = l * 16 + s[i + 3] - '0';
-                if (s[i + 3] >= 'a') {
-                    l += '0' + 10 - 'a';
-                } else if (s[i + 3] >= 'A') {
-                    l += '0' + 10 - 'A';
-                }
+            l = hexa (s + 2, 2);
+            if (l != -1) {
                 i += 4;
             }
             break;
         default:
         }
         VERBOSE (DEBUG, printf("l: 0x%02x '%c'\n", l, l));
-        s[j++] = (l != 0) ? l : s[i++];
+        s[j++] = (l != -1) ? l : s[i++];
     }
     s[j] = '\0';