summaryrefslogtreecommitdiff
path: root/libsoup/soup-misc.c
diff options
context:
space:
mode:
authorDan Winship <danw@src.gnome.org>2007-03-17 17:55:30 +0000
committerDan Winship <danw@src.gnome.org>2007-03-17 17:55:30 +0000
commit21db3a002da39d3d377795fdffa754087e116259 (patch)
tree63a6df375f61b128e202550ed9475f409b137b81 /libsoup/soup-misc.c
parent4ca073650710468846ce567e55fb0b18d84703d1 (diff)
downloadlibsoup-21db3a002da39d3d377795fdffa754087e116259.tar.gz
require glib 2.12. check for timegm().
* configure.in: require glib 2.12. check for timegm(). * libsoup/soup-date.c (soup_mktime_utc): Use timegm if available. (soup_date_iso8601_parse): use g_time_val_from_iso8601. #337010, patch from Emmanuele Bassi. * libsoup/soup-types.h: remove local copy of G_GNUC_NULL_TERMINATED since we now depend on a new-enough copy of glib. * libsoup/soup-misc.c (soup_base64_encode_close) (soup_base64_encode_step, soup_base64_encode) (soup_base64_decode_step): Make these just be wrappers around the glib base64 methods. (For now; eventually they'll just go away.) * libsoup/soup-auth-basic.c (authenticate): * libsoup/soup-auth-digest.c (authenticate): * libsoup/soup-connection-ntlm.c (soup_ntlm_parse_challenge) (soup_ntlm_response): * libsoup/soup-server-auth.c (soup_server_auth_new): * libsoup/soup-soap-message.c (soup_soap_message_write_base64): * libsoup/soup-xmlrpc-message.c (soup_xmlrpc_message_write_base64): * libsoup/soup-xmlrpc-response.c (soup_xmlrpc_value_get_base64): Use glib base64 methods svn path=/trunk/; revision=921
Diffstat (limited to 'libsoup/soup-misc.c')
-rw-r--r--libsoup/soup-misc.c256
1 files changed, 19 insertions, 237 deletions
diff --git a/libsoup/soup-misc.c b/libsoup/soup-misc.c
index d98ff4a8..252596df 100644
--- a/libsoup/soup-misc.c
+++ b/libsoup/soup-misc.c
@@ -50,16 +50,6 @@ soup_str_case_equal (gconstpointer v1,
return g_ascii_strcasecmp (string1, string2) == 0;
}
-/* Base64 utils (straight from camel-mime-utils.c) */
-#define d(x)
-
-static const char *base64_alphabet =
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
-
-/*
- * call this when finished encoding everything, to
- * flush off the last little bit
- */
int
soup_base64_encode_close (const guchar *in,
int inlen,
@@ -68,53 +58,19 @@ soup_base64_encode_close (const guchar *in,
int *state,
int *save)
{
- int c1, c2;
- unsigned char *outptr = out;
-
- if (inlen > 0)
- outptr += soup_base64_encode_step (in,
- inlen,
- break_lines,
- outptr,
- state,
- save);
-
- c1 = ((unsigned char *) save) [1];
- c2 = ((unsigned char *) save) [2];
-
- d(printf("mode = %d\nc1 = %c\nc2 = %c\n",
- (int)((char *) save) [0],
- (int)((char *) save) [1],
- (int)((char *) save) [2]));
-
- switch (((char *) save) [0]) {
- case 2:
- outptr [2] = base64_alphabet[ ( (c2 &0x0f) << 2 ) ];
- g_assert (outptr [2] != 0);
- goto skip;
- case 1:
- outptr[2] = '=';
- skip:
- outptr [0] = base64_alphabet [ c1 >> 2 ];
- outptr [1] = base64_alphabet [ c2 >> 4 | ( (c1&0x3) << 4 )];
- outptr [3] = '=';
- outptr += 4;
- break;
+ if (inlen > 0) {
+ out += soup_base64_encode_step (in,
+ inlen,
+ break_lines,
+ out,
+ state,
+ save);
}
- if (break_lines)
- *outptr++ = '\n';
- *save = 0;
- *state = 0;
-
- return outptr-out;
+ return (int)g_base64_encode_close (break_lines, (char *) out,
+ state, save);
}
-/*
- * performs an 'encode step', only encodes blocks of 3 characters to the
- * output at a time, saves left-over state in state and save (initialise to
- * 0 on first invocation).
- */
int
soup_base64_encode_step (const guchar *in,
int len,
@@ -123,142 +79,16 @@ soup_base64_encode_step (const guchar *in,
int *state,
int *save)
{
- register guchar *outptr;
- register const guchar *inptr;
-
- if (len <= 0)
- return 0;
-
- inptr = in;
- outptr = out;
-
- d (printf ("we have %d chars, and %d saved chars\n",
- len,
- ((char *) save) [0]));
-
- if (len + ((char *) save) [0] > 2) {
- const guchar *inend = in+len-2;
- register int c1, c2, c3;
- register int already;
-
- already = *state;
-
- switch (((char *) save) [0]) {
- case 1: c1 = ((unsigned char *) save) [1]; goto skip1;
- case 2: c1 = ((unsigned char *) save) [1];
- c2 = ((unsigned char *) save) [2]; goto skip2;
- }
-
- /*
- * yes, we jump into the loop, no i'm not going to change it,
- * it's beautiful!
- */
- while (inptr < inend) {
- c1 = *inptr++;
- skip1:
- c2 = *inptr++;
- skip2:
- c3 = *inptr++;
- *outptr++ = base64_alphabet [ c1 >> 2 ];
- *outptr++ = base64_alphabet [ c2 >> 4 |
- ((c1&0x3) << 4) ];
- *outptr++ = base64_alphabet [ ((c2 &0x0f) << 2) |
- (c3 >> 6) ];
- *outptr++ = base64_alphabet [ c3 & 0x3f ];
- /* this is a bit ugly ... */
- if (break_lines && (++already)>=19) {
- *outptr++='\n';
- already = 0;
- }
- }
-
- ((char *)save)[0] = 0;
- len = 2-(inptr-inend);
- *state = already;
- }
-
- d(printf("state = %d, len = %d\n",
- (int)((char *)save)[0],
- len));
-
- if (len>0) {
- register char *saveout;
-
- /* points to the slot for the next char to save */
- saveout = & (((char *)save)[1]) + ((char *)save)[0];
-
- /* len can only be 0 1 or 2 */
- switch(len) {
- case 2: *saveout++ = *inptr++;
- case 1: *saveout++ = *inptr++;
- }
- ((char *)save)[0]+=len;
- }
-
- d(printf("mode = %d\nc1 = %c\nc2 = %c\n",
- (int)((char *)save)[0],
- (int)((char *)save)[1],
- (int)((char *)save)[2]));
-
- return outptr-out;
+ return (int)g_base64_encode_step (in, len, break_lines,
+ (char *)out, state, save);
}
-/**
- * soup_base64_encode:
- * @text: the binary data to encode.
- * @len: the length of @text.
- *
- * Encode a sequence of binary data into it's Base-64 stringified
- * representation.
- *
- * Return value: The Base-64 encoded string representing @text.
- */
char *
soup_base64_encode (const char *text, int len)
{
- unsigned char *out;
- int state = 0, outlen, save = 0;
-
- out = g_malloc (len * 4 / 3 + 5);
- outlen = soup_base64_encode_close ((const guchar *)text,
- len,
- FALSE,
- out,
- &state,
- &save);
- out[outlen] = '\0';
- return (char *) out;
+ return g_base64_encode ((const guchar *)text, len);
}
-static unsigned char camel_mime_base64_rank[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, 62,255,255,255, 63,
- 52, 53, 54, 55, 56, 57, 58, 59, 60, 61,255,255,255, 0,255,255,
- 255, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
- 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,255,255,255,255,255,
- 255, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
- 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,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,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,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,
-};
-
-/**
- * base64_decode_step: decode a chunk of base64 encoded data
- * @in: input stream
- * @len: max length of data to decode
- * @out: output stream
- * @state: holds the number of bits that are stored in @save
- * @save: leftover bits that have not yet been decoded
- *
- * Decodes a chunk of base64 encoded data
- **/
int
soup_base64_decode_step (const guchar *in,
int len,
@@ -266,68 +96,20 @@ soup_base64_decode_step (const guchar *in,
int *state,
guint *save)
{
- register const guchar *inptr;
- register guchar *outptr;
- const guchar *inend;
- guchar c;
- register unsigned int v;
- int i;
-
- inend = in+len;
- outptr = out;
-
- /* convert 4 base64 bytes to 3 normal bytes */
- v=*save;
- i=*state;
- inptr = in;
- while (inptr < inend) {
- c = camel_mime_base64_rank [*inptr++];
- if (c != 0xff) {
- v = (v<<6) | c;
- i++;
- if (i==4) {
- *outptr++ = v>>16;
- *outptr++ = v>>8;
- *outptr++ = v;
- i=0;
- }
- }
- }
-
- *save = v;
- *state = i;
-
- /* quick scan back for '=' on the end somewhere */
- /* fortunately we can drop 1 output char for each trailing = (upto 2) */
- i=2;
- while (inptr > in && i) {
- inptr--;
- if (camel_mime_base64_rank [*inptr] != 0xff) {
- if (*inptr == '=')
- outptr--;
- i--;
- }
- }
-
- /* if i!= 0 then there is a truncation error! */
- return outptr - out;
+ return (int) g_base64_decode_step ((const char *)in, len,
+ out, state, save);
}
char *
soup_base64_decode (const char *text,
int *out_len)
{
- guchar *ret;
- int inlen, state = 0;
- unsigned int save = 0;
-
- inlen = strlen (text);
- ret = g_malloc0 (inlen);
-
- *out_len = soup_base64_decode_step ((const guchar *)text, inlen,
- ret, &state, &save);
+ char *ret;
+ gsize out_len_tmp;
- return (char *)ret;
+ ret = (char *) g_base64_decode (text, &out_len_tmp);
+ *out_len = out_len_tmp;
+ return ret;
}
typedef struct {