• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2021 Alyssa Rosenzweig <alyssa@rosenzweig.io>
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice (including the next
12  * paragraph) shall be included in all copies or substantial portions of the
13  * Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21  * SOFTWARE.
22  */
23 
24 #ifndef __HEXDUMP_H
25 #define __HEXDUMP_H
26 
27 static void
hexdump(FILE * fp,const uint8_t * hex,size_t cnt,bool with_strings)28 hexdump(FILE *fp, const uint8_t *hex, size_t cnt, bool with_strings)
29 {
30    for (unsigned i = 0; i < cnt; ++i) {
31       if ((i & 0xF) == 0)
32          fprintf(fp, "%06X  ", i);
33 
34       uint8_t v = hex[i];
35 
36       if (v == 0 && (i & 0xF) == 0) {
37          /* Check if we're starting an aligned run of zeroes */
38          unsigned zero_count = 0;
39 
40          for (unsigned j = i; j < cnt; ++j) {
41             if (hex[j] == 0)
42                zero_count++;
43             else
44                break;
45          }
46 
47          if (zero_count >= 32) {
48             fprintf(fp, "*\n");
49             i += (zero_count & ~0xF) - 1;
50             continue;
51          }
52       }
53 
54       fprintf(fp, "%02X ", hex[i]);
55       if ((i & 0xF) == 0xF && with_strings) {
56          fprintf(fp, " | ");
57          for (unsigned j = i & ~0xF; j <= i; ++j) {
58             uint8_t c = hex[j];
59             fputc((c < 32 || c > 128) ? '.' : c, fp);
60          }
61       }
62 
63       if ((i & 0xF) == 0xF)
64          fprintf(fp, "\n");
65    }
66 
67    fprintf(fp, "\n");
68 }
69 
70 #endif
71