summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2015-03-13 08:22:26 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2015-03-13 08:22:27 +0100
commit5dd5884801669b17705cd030e9e82a4f1de50296 (patch)
treebbd1a44158edda9ce6bc577498698d27d3ac3949 /lib
parent08a50cd3064ad367bd23c217d26856cc1ac47d57 (diff)
downloadbarebox-5dd5884801669b17705cd030e9e82a4f1de50296.tar.gz
barebox-5dd5884801669b17705cd030e9e82a4f1de50296.tar.xz
lib: Add hex2bin and bin2hex implementations
Taken from the Kernel, put into the same place as in the kernel, although the hexdump.c does not actually contain hexdum functions. Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'lib')
-rw-r--r--lib/Makefile1
-rw-r--r--lib/hexdump.c74
-rw-r--r--lib/misc.c2
3 files changed, 75 insertions, 2 deletions
diff --git a/lib/Makefile b/lib/Makefile
index f08ac5937d..6a3e9fdc8e 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -53,3 +53,4 @@ obj-y += wchar.o
obj-y += libfile.o
obj-y += bitmap.o
obj-y += gcd.o
+obj-y += hexdump.o
diff --git a/lib/hexdump.c b/lib/hexdump.c
new file mode 100644
index 0000000000..3b1d5e6736
--- /dev/null
+++ b/lib/hexdump.c
@@ -0,0 +1,74 @@
+/*
+ * lib/hexdump.c
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation. See README and COPYING for
+ * more details.
+ */
+
+#include <common.h>
+#include <linux/kernel.h>
+#include <linux/ctype.h>
+
+const char hex_asc[] = "0123456789abcdef";
+EXPORT_SYMBOL(hex_asc);
+const char hex_asc_upper[] = "0123456789ABCDEF";
+EXPORT_SYMBOL(hex_asc_upper);
+
+/**
+ * hex_to_bin - convert a hex digit to its real value
+ * @ch: ascii character represents hex digit
+ *
+ * hex_to_bin() converts one hex digit to its actual value or -1 in case of bad
+ * input.
+ */
+int hex_to_bin(char ch)
+{
+ if ((ch >= '0') && (ch <= '9'))
+ return ch - '0';
+ ch = tolower(ch);
+ if ((ch >= 'a') && (ch <= 'f'))
+ return ch - 'a' + 10;
+ return -1;
+}
+EXPORT_SYMBOL(hex_to_bin);
+
+/**
+ * hex2bin - convert an ascii hexadecimal string to its binary representation
+ * @dst: binary result
+ * @src: ascii hexadecimal string
+ * @count: result length
+ *
+ * Return 0 on success, -1 in case of bad input.
+ */
+int hex2bin(u8 *dst, const char *src, size_t count)
+{
+ while (count--) {
+ int hi = hex_to_bin(*src++);
+ int lo = hex_to_bin(*src++);
+
+ if ((hi < 0) || (lo < 0))
+ return -1;
+
+ *dst++ = (hi << 4) | lo;
+ }
+ return 0;
+}
+EXPORT_SYMBOL(hex2bin);
+
+/**
+ * bin2hex - convert binary data to an ascii hexadecimal string
+ * @dst: ascii hexadecimal result
+ * @src: binary data
+ * @count: binary data length
+ */
+char *bin2hex(char *dst, const void *src, size_t count)
+{
+ const unsigned char *_src = src;
+
+ while (count--)
+ dst = hex_byte_pack(dst, *_src++);
+ return dst;
+}
+EXPORT_SYMBOL(bin2hex);
diff --git a/lib/misc.c b/lib/misc.c
index 87626c1e8b..62ddd66779 100644
--- a/lib/misc.c
+++ b/lib/misc.c
@@ -114,5 +114,3 @@ int parse_area_spec(const char *str, loff_t *start, loff_t *size)
return -1;
}
EXPORT_SYMBOL(parse_area_spec);
-
-const char hex_asc[] = "0123456789abcdef";