From 2a1b34a623e6e4f28481400637a3a99d5f7adc53 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Remko=20Tron=C3=A7on?= <git@el-tramo.be>
Date: Thu, 18 Apr 2013 20:59:27 +0200
Subject: Implemented different hexify.

Change-Id: Iad114775661f5f8f11070acf203c559cbf69fade

diff --git a/Swiften/StringCodecs/Hexify.cpp b/Swiften/StringCodecs/Hexify.cpp
index 0e6dc4e..ed2b2a3 100644
--- a/Swiften/StringCodecs/Hexify.cpp
+++ b/Swiften/StringCodecs/Hexify.cpp
@@ -33,20 +33,39 @@ std::string Hexify::hexify(const ByteArray& data) {
 	return std::string(result.str());
 }
 
-ByteArray Hexify::unhexify(const std::string& hexstring) {
-	if (hexstring.size() % 2) {
+
+static const unsigned char map[256] = {
+	255, 255, 255, 255, 255, 255, 255, 255,
+	255, 255, 255, 255, 255, 255, 255, 255,
+	255, 255, 255, 255, 255, 255, 255, 255, 
+	255, 255, 255, 255, 255, 255, 255, 255,
+	255, 255, 255, 255, 255, 255, 255, 255,
+	255, 255, 255, 255, 255, 255, 255, 255,
+	0,   1,   2,   3,   4,   5,   6,   7,
+	8,   9,   255, 255, 255, 255, 255, 255,
+	255, 10,  11,  12,  13,  14,  15,  255,
+	255, 255, 255, 255, 255, 255, 255, 255,
+	255, 255, 255, 255, 255, 255, 255, 255,
+	255, 255, 255, 255, 255, 255, 255, 255,
+	255, 10,  11,  12,  13,  14,  15,  255,
+	255, 255, 255, 255, 255, 255, 255, 255,
+	255, 255, 255, 255, 255, 255, 255, 255,
+	255, 255, 255, 255, 255, 255, 255, 255
+};
+
+ByteArray Hexify::unhexify(const std::string& in) {
+	if (in.size() % 2) {
 		return ByteArray();
 	}
-	ByteArray result = ByteArray(hexstring.size() / 2);
-	for (size_t pos = 0; pos < hexstring.size() - 1; pos += 2) {
-		char c;
-		c = hexstring[pos];
-		int a = (c>='0'&&c<='9') ? c-'0' : (c>='A'&&c<='Z') ? c-'A' + 10 : (c>='a'&&c<='z') ? c-'a' + 10 : -1;
-		c = hexstring[pos+1];
-		int b = (c>='0'&&c<='9') ? c-'0' : (c>='A'&&c<='Z') ? c-'A' + 10 : (c>='a'&&c<='z') ? c-'a' + 10 : -1;
-		if (a == -1 || b == -1) return ByteArray(); // fail
-		result[pos/2] = (a<<4) | b;
 
+	ByteArray result(in.size() / 2);
+	for (size_t pos = 0; pos < in.size() - 1; pos += 2) {
+		unsigned char a = map[static_cast<size_t>(in[pos])];
+		unsigned char b = map[static_cast<size_t>(in[pos+1])];
+		if (a == 255 || b == 255) {
+			return ByteArray();
+		}
+		result[pos/2] = (a<<4) | b;
 	}
 	return result;
 }
-- 
cgit v0.10.2-6-g49f6