• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2012-2018 Rob Clark <robdclark@gmail.com>
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 __UTIL_H__
25 #define __UTIL_H__
26 
27 #include <ctype.h>
28 #include <stdint.h>
29 #include <stdio.h>
30 
31 #include "util/u_math.h"
32 
33 /* old-style program binary XOR'd ascii w/ 0xff */
34 #ifndef ASCII_XOR
35 #define ASCII_XOR 0
36 #endif
37 
38 static inline const char *
tab(int lvl)39 tab(int lvl)
40 {
41    const char *TAB = "\t\t\t\t\t\t\t\t\0";
42    return &TAB[strlen(TAB) - lvl];
43 }
44 
45 static inline void
dump_hex(const void * buf,int sz)46 dump_hex(const void *buf, int sz)
47 {
48    uint8_t *ptr = (uint8_t *)buf;
49    uint8_t *end = ptr + sz;
50    int i = 0;
51 
52    while (ptr < end) {
53       uint32_t d = 0;
54 
55       printf((i % 8) ? " " : "\t");
56 
57       d |= *(ptr++) << 0;
58       d |= *(ptr++) << 8;
59       d |= *(ptr++) << 16;
60       d |= (uint32_t)*(ptr++) << 24;
61 
62       printf("%08x", d);
63 
64       if ((i % 8) == 7) {
65          printf("\n");
66       }
67 
68       i++;
69    }
70 
71    if (i % 8) {
72       printf("\n");
73    }
74 }
75 
76 static inline void
dump_float(const void * buf,int sz)77 dump_float(const void *buf, int sz)
78 {
79    uint8_t *ptr = (uint8_t *)buf;
80    uint8_t *end = ptr + sz - 3;
81    int i = 0;
82 
83    while (ptr < end) {
84       uint32_t d = 0;
85 
86       printf((i % 8) ? " " : "\t");
87 
88       d |= *(ptr++) << 0;
89       d |= *(ptr++) << 8;
90       d |= *(ptr++) << 16;
91       d |= (uint32_t)*(ptr++) << 24;
92 
93       printf("%8f", uif(d));
94 
95       if ((i % 8) == 7) {
96          printf("\n");
97       }
98 
99       i++;
100    }
101 
102    if (i % 8) {
103       printf("\n");
104    }
105 }
106 
107 #define is_ok_ascii(c) (isascii(c) && ((c == '\t') || !iscntrl(c)))
108 
109 static inline void
clean_ascii(char * buf,int sz)110 clean_ascii(char *buf, int sz)
111 {
112    uint8_t *ptr = (uint8_t *)buf;
113    uint8_t *end = ptr + sz;
114    while (ptr < end) {
115       *(ptr++) ^= ASCII_XOR;
116    }
117 }
118 
119 static inline void
dump_ascii(const void * buf,int sz)120 dump_ascii(const void *buf, int sz)
121 {
122    uint8_t *ptr = (uint8_t *)buf;
123    uint8_t *end = ptr + sz;
124    printf("\t");
125    while (ptr < end) {
126       uint8_t c = *(ptr++) ^ ASCII_XOR;
127       if (c == '\n') {
128          printf("\n\t");
129       } else if (c == '\0') {
130          printf("\n\t-----------------------------------\n\t");
131       } else if (is_ok_ascii(c)) {
132          printf("%c", c);
133       } else {
134          printf("?");
135       }
136    }
137    printf("\n");
138 }
139 
140 static inline void
dump_hex_ascii(const void * buf,int sz,int level)141 dump_hex_ascii(const void *buf, int sz, int level)
142 {
143    uint8_t *ptr = (uint8_t *)buf;
144    uint8_t *end = ptr + sz;
145    uint8_t *ascii = ptr;
146    int i = 0;
147 
148    printf("%s-----------------------------------------------\n", tab(level));
149    printf("%s%d (0x%x) bytes\n", tab(level), sz, sz);
150 
151    while (ptr < end) {
152       uint32_t d = 0;
153 
154       if (i % 4) {
155          printf(" ");
156       } else {
157          printf("%s%06x: ", tab(level), (uint32_t)(ptr - (uint8_t *)buf));
158       }
159 
160       d |= *(ptr++) << 0;
161       d |= *(ptr++) << 8;
162       d |= *(ptr++) << 16;
163       d |= (uint32_t)*(ptr++) << 24;
164 
165       printf("%08x", d);
166 
167       if ((i % 4) == 3) {
168          int j;
169          printf("\t|");
170          for (j = 0; j < 16; j++) {
171             uint8_t c = *(ascii++);
172             c ^= ASCII_XOR;
173             printf("%c", (isascii(c) && !iscntrl(c)) ? c : '.');
174          }
175          printf("|\n");
176       }
177 
178       i++;
179    }
180 
181    if (i % 4) {
182       for (int j = 4 - (i % 4); j > 0; j--) {
183          printf("         ");
184       }
185       printf("\t|");
186       while (ascii < end) {
187          uint8_t c = *(ascii++);
188          c ^= ASCII_XOR;
189          printf("%c", (isascii(c) && !iscntrl(c)) ? c : '.');
190       }
191       printf("|\n");
192    }
193 }
194 
195 #endif /* __UTIL_H__ */
196