From c8dd07333a29cc05a2f1536e8d71221ce831474b Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Tue, 13 Jan 2009 19:59:32 +0000 Subject: [PATCH] Bug 564728 Add function to decode base64 encoded data in place MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 2009-01-13 Matthias Clasen Bug 564728 Add function to decode base64 encoded data in place * glib/glib.symbols: * glib/gbase64.[hc] (g_base64_decode_inplace): New convenience API to decode in place, overwriting the input string. Patch by Sebastian Dröge. svn path=/trunk/; revision=7807 --- ChangeLog | 9 +++++++++ docs/reference/ChangeLog | 5 +++++ docs/reference/glib/glib-sections.txt | 1 + docs/reference/glib/tmpl/base64.sgml | 3 ++- glib/gbase64.c | 33 +++++++++++++++++++++++++++++++++ glib/gbase64.h | 3 +++ glib/glib.symbols | 1 + 7 files changed, 54 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index c350ced..61e6532 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2009-01-13 Matthias Clasen + + Bug 564728 Add function to decode base64 encoded data in place + + * glib/glib.symbols: + * glib/gbase64.[hc] (g_base64_decode_inplace): New convenience + API to decode in place, overwriting the input string. Patch by + Sebastian Dröge. + 2009-01-12 Matthias Clasen * glib/gtestutils.c (g_strcmp0): Be more explicit about the NULL diff --git a/docs/reference/ChangeLog b/docs/reference/ChangeLog index b2ba91a..306a897 100644 --- a/docs/reference/ChangeLog +++ b/docs/reference/ChangeLog @@ -1,3 +1,8 @@ +2009-01-13 Matthias Clasen + + * glib/glib-sections.txt: + * glib/tmpl/base64.sgml: Mention g_base64_decode_inplace + 2009-01-05 Matthias Clasen * === Released 2.19.4 === diff --git a/docs/reference/glib/glib-sections.txt b/docs/reference/glib/glib-sections.txt index 49a51bf..e7e09ed 100644 --- a/docs/reference/glib/glib-sections.txt +++ b/docs/reference/glib/glib-sections.txt @@ -2527,6 +2527,7 @@ g_base64_encode_close g_base64_encode g_base64_decode_step g_base64_decode +g_base64_decode_inplace
diff --git a/docs/reference/glib/tmpl/base64.sgml b/docs/reference/glib/tmpl/base64.sgml index 787be6d..64aec5a 100644 --- a/docs/reference/glib/tmpl/base64.sgml +++ b/docs/reference/glib/tmpl/base64.sgml @@ -18,7 +18,8 @@ for email. GLib supports incremental encoding using g_base64_encode_step() and g_base64_encode_close(). Incremental decoding can be done with g_base64_decode_step(). To encode or decode data in one go, use -g_base64_encode() or g_base64_decode(). +g_base64_encode() or g_base64_decode(). To avoid memory allocation when +decoding, you can use g_base64_decode_inplace(). diff --git a/glib/gbase64.c b/glib/gbase64.c index 437c4c9..7f83c88 100644 --- a/glib/gbase64.c +++ b/glib/gbase64.c @@ -374,6 +374,39 @@ g_base64_decode (const gchar *text, return ret; } + +/** + * g_base64_decode_inplace: + * @text: zero-terminated string with base64 text to decode + * @out_len: The length of the decoded data is written here + * + * Decode a sequence of Base-64 encoded text into binary data + * by overwriting the input data. + * + * Return value: The binary data that @text responds. This pointer + * is the same as the input @text. + * + * Since: 2.20 + */ +guchar * +g_base64_decode_inplace (gchar *text, + gsize *out_len) +{ + gint input_length, state = 0; + guint save = 0; + + g_return_val_if_fail (text != NULL, NULL); + g_return_val_if_fail (out_len != NULL, NULL); + + input_length = strlen (text); + + g_return_val_if_fail (input_length > 1, NULL); + + *out_len = g_base64_decode_step (text, input_length, (guchar *) text, &state, &save); + + return text; +} + #define __G_BASE64_C__ #include "galiasdef.c" diff --git a/glib/gbase64.h b/glib/gbase64.h index 63f08a4..2f7c49f 100644 --- a/glib/gbase64.h +++ b/glib/gbase64.h @@ -48,6 +48,9 @@ gsize g_base64_decode_step (const gchar *in, guint *save); guchar *g_base64_decode (const gchar *text, gsize *out_len) G_GNUC_MALLOC; +guchar *g_base64_decode_inplace (gchar *text, + gsize *out_len); + G_END_DECLS diff --git a/glib/glib.symbols b/glib/glib.symbols index 0667062..333164f 100644 --- a/glib/glib.symbols +++ b/glib/glib.symbols @@ -111,6 +111,7 @@ g_base64_encode_close g_base64_encode G_GNUC_MALLOC g_base64_decode_step g_base64_decode G_GNUC_MALLOC +g_base64_decode_inplace #endif #endif -- 2.7.4