diff options
author | Dan Winship <danw@src.gnome.org> | 2007-03-17 17:55:30 +0000 |
---|---|---|
committer | Dan Winship <danw@src.gnome.org> | 2007-03-17 17:55:30 +0000 |
commit | 21db3a002da39d3d377795fdffa754087e116259 (patch) | |
tree | 63a6df375f61b128e202550ed9475f409b137b81 /libsoup/soup-misc.c | |
parent | 4ca073650710468846ce567e55fb0b18d84703d1 (diff) | |
download | libsoup-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.c | 256 |
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 { |