diff src/util.c @ 11127:719779387f96

[gaim-migrate @ 13183] Change the base16 and base64 functions to use better data types, and make appropriate changes to other parts of the Gaim code to get rid of a few warnings and hopefully make things more correct. In other news, why is CVS HEAD crashing for me on exit? committer: Tailor Script <tailor@pidgin.im>
author Mark Doliner <mark@kingant.net>
date Tue, 19 Jul 2005 05:15:45 +0000
parents a8a7730db73c
children a4611130e3eb
line wrap: on
line diff
--- a/src/util.c	Tue Jul 19 03:51:54 2005 +0000
+++ b/src/util.c	Tue Jul 19 05:15:45 2005 +0000
@@ -67,34 +67,34 @@
 /**************************************************************************
  * Base16 Functions
  **************************************************************************/
-unsigned char *
-gaim_base16_encode(const unsigned char *data, int length)
+gchar *
+gaim_base16_encode(const guint8 *data, gsize len)
 {
 	int i;
-	unsigned char *ascii = NULL;
+	gchar *ascii = NULL;
 
 	g_return_val_if_fail(data != NULL, NULL);
-	g_return_val_if_fail(length > 0,   NULL);
-
-	ascii = g_malloc(length * 2 + 1);
-
-	for (i = 0; i < length; i++)
+	g_return_val_if_fail(len > 0,   NULL);
+
+	ascii = g_malloc(len * 2 + 1);
+
+	for (i = 0; i < len; i++)
 		snprintf(&ascii[i * 2], 3, "%02hhx", data[i]);
 
 	return ascii;
 }
 
-int
-gaim_base16_decode(const char *ascii, unsigned char **raw)
+guint8 *
+gaim_base16_decode(const char *str, gsize *ret_len)
 {
 	int len, i, accumulator = 0;
-	unsigned char *data;
-
-	g_return_val_if_fail(ascii != NULL, 0);
-
-	len = strlen(ascii);
-
-	g_return_val_if_fail(strlen(ascii) > 0, 0);
+	guint8 *data;
+
+	g_return_val_if_fail(str != NULL, NULL);
+
+	len = strlen(str);
+
+	g_return_val_if_fail(strlen(str) > 0, 0);
 	g_return_val_if_fail(len % 2 > 0,       0);
 
 	data = g_malloc(len / 2);
@@ -106,11 +106,11 @@
 		else
 			accumulator <<= 4;
 
-		if (isdigit(ascii[i]))
-			accumulator |= ascii[i] - 48;
+		if (isdigit(str[i]))
+			accumulator |= str[i] - 48;
 		else
 		{
-			switch(ascii[i])
+			switch(str[i])
 			{
 				case 'a':  case 'A':  accumulator |= 10;  break;
 				case 'b':  case 'B':  accumulator |= 11;  break;
@@ -125,9 +125,10 @@
 			data[(i - 1) / 2] = accumulator;
 	}
 
-	*raw = data;
-
-	return (len / 2);
+	if (ret_len != NULL)
+		*ret_len = len / 2;
+
+	return data;
 }
 
 /**************************************************************************
@@ -140,37 +141,37 @@
 static const char xdigits[] =
 	"0123456789abcdef";
 
-unsigned char *
-gaim_base64_encode(const unsigned char *in, size_t inlen)
+gchar *
+gaim_base64_encode(const guint8 *data, gsize len)
 {
 	char *out, *rv;
 
-	g_return_val_if_fail(in != NULL, NULL);
-	g_return_val_if_fail(inlen > 0,  NULL);
-
-	rv = out = g_malloc(((inlen/3)+1)*4 + 1);
-
-	for (; inlen >= 3; inlen -= 3)
+	g_return_val_if_fail(data != NULL, NULL);
+	g_return_val_if_fail(len > 0,  NULL);
+
+	rv = out = g_malloc(((len/3)+1)*4 + 1);
+
+	for (; len >= 3; len -= 3)
 	{
-		*out++ = alphabet[in[0] >> 2];
-		*out++ = alphabet[((in[0] << 4) & 0x30) | (in[1] >> 4)];
-		*out++ = alphabet[((in[1] << 2) & 0x3c) | (in[2] >> 6)];
-		*out++ = alphabet[in[2] & 0x3f];
-		in += 3;
+		*out++ = alphabet[data[0] >> 2];
+		*out++ = alphabet[((data[0] << 4) & 0x30) | (data[1] >> 4)];
+		*out++ = alphabet[((data[1] << 2) & 0x3c) | (data[2] >> 6)];
+		*out++ = alphabet[data[2] & 0x3f];
+		data += 3;
 	}
 
-	if (inlen > 0)
+	if (len > 0)
 	{
 		unsigned char fragment;
 
-		*out++ = alphabet[in[0] >> 2];
-		fragment = (in[0] << 4) & 0x30;
-
-		if (inlen > 1)
-			fragment |= in[1] >> 4;
+		*out++ = alphabet[data[0] >> 2];
+		fragment = (data[0] << 4) & 0x30;
+
+		if (len > 1)
+			fragment |= data[1] >> 4;
 
 		*out++ = alphabet[fragment];
-		*out++ = (inlen < 2) ? '=' : alphabet[(in[1] << 2) & 0x3c];
+		*out++ = (len < 2) ? '=' : alphabet[(data[1] << 2) & 0x3c];
 		*out++ = '=';
 	}
 
@@ -179,19 +180,18 @@
 	return rv;
 }
 
-void
-gaim_base64_decode(const char *text, char **data, int *size)
+guint8 *
+gaim_base64_decode(const char *str, gsize *ret_len)
 {
-	char *out = NULL;
+	guint8 *out = NULL;
 	char tmp = 0;
 	const char *c;
 	gint32 tmp2 = 0;
 	int len = 0, n = 0;
 
-	g_return_if_fail(text != NULL);
-	g_return_if_fail(data != NULL);
-
-	c = text;
+	g_return_val_if_fail(str != NULL, NULL);
+
+	c = str;
 
 	while (*c) {
 		if (*c >= 'A' && *c <= 'Z') {
@@ -210,13 +210,13 @@
 		} else if (*c == '=') {
 			if (n == 3) {
 				out = g_realloc(out, len + 2);
-				out[len] = (char)(tmp2 >> 10) & 0xff;
+				out[len] = (guint8)(tmp2 >> 10) & 0xff;
 				len++;
-				out[len] = (char)(tmp2 >> 2) & 0xff;
+				out[len] = (guint8)(tmp2 >> 2) & 0xff;
 				len++;
 			} else if (n == 2) {
 				out = g_realloc(out, len + 1);
-				out[len] = (char)(tmp2 >> 4) & 0xff;
+				out[len] = (guint8)(tmp2 >> 4) & 0xff;
 				len++;
 			}
 			break;
@@ -225,11 +225,11 @@
 		n++;
 		if (n == 4) {
 			out = g_realloc(out, len + 3);
-			out[len] = (char)((tmp2 >> 16) & 0xff);
+			out[len] = (guint8)((tmp2 >> 16) & 0xff);
 			len++;
-			out[len] = (char)((tmp2 >> 8) & 0xff);
+			out[len] = (guint8)((tmp2 >> 8) & 0xff);
 			len++;
-			out[len] = (char)(tmp2 & 0xff);
+			out[len] = (guint8)(tmp2 & 0xff);
 			len++;
 			tmp2 = 0;
 			n = 0;
@@ -240,10 +240,10 @@
 	out = g_realloc(out, len + 1);
 	out[len] = 0;
 
-	*data = out;
-
-	if (size)
-		*size = len;
+	if (ret_len != NULL)
+		*ret_len = len;
+
+	return out;
 }
 
 /**************************************************************************
@@ -410,12 +410,12 @@
 				char *charset = g_strndup(charset0, encoding0 - charset0 - 1);
 				char *encoding = g_strndup(encoding0, encoded_text0 - encoding0 - 1);
 				char *encoded_text = g_strndup(encoded_text0, cur - encoded_text0 - 1);
-				char *decoded = NULL;
-				int dec_len;
+				guint8 *decoded = NULL;
+				gsize dec_len;
 				if (g_ascii_strcasecmp(encoding, "Q") == 0)
 					gaim_quotedp_decode(encoded_text, &decoded, &dec_len);
 				else if (g_ascii_strcasecmp(encoding, "B") == 0)
-					gaim_base64_decode(encoded_text, &decoded, &dec_len);
+					decoded = gaim_base64_decode(encoded_text, &dec_len);
 				else
 					decoded = NULL;
 				if (decoded) {