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