]>
Commit | Line | Data |
---|---|---|
f8c987f8 AB |
1 | /* SPDX-License-Identifier: GPL-2.0+ */ |
2 | /* | |
3 | * Copyright (C) 2018 Synopsys, Inc. All rights reserved. | |
4 | * | |
5 | */ | |
6 | ||
7 | #ifndef HEXDUMP_H | |
8 | #define HEXDUMP_H | |
9 | ||
10 | #include <linux/ctype.h> | |
11 | #include <linux/types.h> | |
12 | ||
13 | enum { | |
14 | DUMP_PREFIX_NONE, | |
15 | DUMP_PREFIX_ADDRESS, | |
16 | DUMP_PREFIX_OFFSET | |
17 | }; | |
18 | ||
19 | extern const char hex_asc[]; | |
20 | #define hex_asc_lo(x) hex_asc[((x) & 0x0f)] | |
21 | #define hex_asc_hi(x) hex_asc[((x) & 0xf0) >> 4] | |
22 | ||
23 | static inline char *hex_byte_pack(char *buf, u8 byte) | |
24 | { | |
25 | *buf++ = hex_asc_hi(byte); | |
26 | *buf++ = hex_asc_lo(byte); | |
27 | return buf; | |
28 | } | |
29 | ||
30 | /** | |
31 | * hex_to_bin - convert a hex digit to its real value | |
32 | * @ch: ascii character represents hex digit | |
33 | * | |
34 | * hex_to_bin() converts one hex digit to its actual value or -1 in case of bad | |
35 | * input. | |
36 | */ | |
37 | static inline int hex_to_bin(char ch) | |
38 | { | |
39 | if ((ch >= '0') && (ch <= '9')) | |
40 | return ch - '0'; | |
41 | ch = tolower(ch); | |
42 | if ((ch >= 'a') && (ch <= 'f')) | |
43 | return ch - 'a' + 10; | |
44 | return -1; | |
45 | } | |
46 | ||
47 | /** | |
48 | * hex2bin - convert an ascii hexadecimal string to its binary representation | |
49 | * @dst: binary result | |
50 | * @src: ascii hexadecimal string | |
51 | * @count: result length | |
52 | * | |
53 | * Return 0 on success, -1 in case of bad input. | |
54 | */ | |
55 | static inline int hex2bin(u8 *dst, const char *src, size_t count) | |
56 | { | |
57 | while (count--) { | |
58 | int hi = hex_to_bin(*src++); | |
59 | int lo = hex_to_bin(*src++); | |
60 | ||
61 | if ((hi < 0) || (lo < 0)) | |
62 | return -1; | |
63 | ||
64 | *dst++ = (hi << 4) | lo; | |
65 | } | |
66 | return 0; | |
67 | } | |
68 | ||
69 | /** | |
70 | * bin2hex - convert binary data to an ascii hexadecimal string | |
71 | * @dst: ascii hexadecimal result | |
72 | * @src: binary data | |
73 | * @count: binary data length | |
74 | */ | |
75 | static inline char *bin2hex(char *dst, const void *src, size_t count) | |
76 | { | |
77 | const unsigned char *_src = src; | |
78 | ||
79 | while (count--) | |
80 | dst = hex_byte_pack(dst, *_src++); | |
81 | return dst; | |
82 | } | |
83 | ||
84 | int hex_dump_to_buffer(const void *buf, size_t len, int rowsize, int groupsize, | |
85 | char *linebuf, size_t linebuflen, bool ascii); | |
86 | void print_hex_dump(const char *prefix_str, int prefix_type, int rowsize, | |
87 | int groupsize, const void *buf, size_t len, bool ascii); | |
88 | void print_hex_dump_bytes(const char *prefix_str, int prefix_type, | |
89 | const void *buf, size_t len); | |
90 | ||
91 | #endif /* HEXDUMP_H */ |