Added silc_hexdump.
[crypto.git] / lib / silcutil / silcutil.c
index 12315f7f96255c303cd263d13cc071b51b26e90e..5cd09db067d6b3ea2495925848ae9a4395d59290 100644 (file)
@@ -565,3 +565,68 @@ char *silc_get_input(const char *prompt, SilcBool echo_off)
   return NULL;
 #endif /* SILC_UNIX */
 }
+
+/* Hexdump */
+
+void silc_hexdump(const unsigned char *data, SilcUInt32 data_len,
+                 FILE *output)
+{
+  int i, k;
+  int off, pos, count;
+  int len = data_len;
+
+  k = 0;
+  pos = 0;
+  count = 16;
+  off = len % 16;
+  while (1) {
+    if (off) {
+      if ((len - pos) < 16 && (len - pos <= len - off))
+       count = off;
+    } else {
+      if (pos == len)
+       count = 0;
+    }
+    if (off == len)
+      count = len;
+
+    if (count)
+      fprintf(output, "%08X  ", k++ * 16);
+
+    for (i = 0; i < count; i++) {
+      fprintf(output, "%02X ", data[pos + i]);
+
+      if ((i + 1) % 4 == 0)
+       fprintf(output, " ");
+    }
+
+    if (count && count < 16) {
+      int j;
+
+      for (j = 0; j < 16 - count; j++) {
+       fprintf(output, "   ");
+
+       if ((j + count + 1) % 4 == 0)
+         fprintf(output, " ");
+      }
+    }
+
+    for (i = 0; i < count; i++) {
+      char ch;
+
+      if (data[pos] < 32 || data[pos] >= 127)
+       ch = '.';
+      else
+       ch = data[pos];
+
+      fprintf(output, "%c", ch);
+      pos++;
+    }
+
+    if (count)
+      fprintf(output, "\n");
+
+    if (count < 16)
+      break;
+  }
+}