Author: fejj
Date: Sun Feb 10 00:34:28 2008
New Revision: 1220
URL: http://svn.gnome.org/viewvc/gmime?rev=1220&view=rev

Log:
2008-02-09  Jeffrey Stedfast  <[EMAIL PROTECTED]>

        * gmime/gmime-filter-basic.c (filter_filter): Use the new macros
        defined below.

        * gmime/gmime-utils.c (rfc2047_encode_word): Use the new macros.

        * gmime/gmime-utils.h: Added more accurate encoding-length macros
        for base64, quoted-printable, and uuencode which are try to
        minimize over-calculating the amount of output data that we
        need. Also namespaced them.



Modified:
   trunk/ChangeLog
   trunk/docs/reference/gmime-sections.txt
   trunk/gmime/gmime-filter-basic.c
   trunk/gmime/gmime-utils.c
   trunk/gmime/gmime-utils.h

Modified: trunk/docs/reference/gmime-sections.txt
==============================================================================
--- trunk/docs/reference/gmime-sections.txt     (original)
+++ trunk/docs/reference/gmime-sections.txt     Sun Feb 10 00:34:28 2008
@@ -893,15 +893,18 @@
 g_mime_utils_8bit_header_encode_phrase
 g_mime_utils_structured_header_fold
 g_mime_utils_unstructured_header_fold
+GMIME_BASE64_ENCODE_LEN
 g_mime_utils_base64_decode_step
 g_mime_utils_base64_encode_step
 g_mime_utils_base64_encode_close
 GMIME_UUDECODE_STATE_INIT
 GMIME_UUDECODE_STATE_BEGIN
 GMIME_UUDECODE_STATE_END
+GMIME_UUENCODE_LEN
 g_mime_utils_uudecode_step
 g_mime_utils_uuencode_step
 g_mime_utils_uuencode_close
+GMIME_QP_ENCODE_LEN
 g_mime_utils_quoted_decode_step
 g_mime_utils_quoted_encode_step
 g_mime_utils_quoted_encode_close

Modified: trunk/gmime/gmime-filter-basic.c
==============================================================================
--- trunk/gmime/gmime-filter-basic.c    (original)
+++ trunk/gmime/gmime-filter-basic.c    Sun Feb 10 00:34:28 2008
@@ -131,29 +131,26 @@
        
        switch (basic->type) {
        case GMIME_FILTER_BASIC_BASE64_ENC:
-               /* wont go to more than 2x size (overly conservative) */
-               g_mime_filter_set_size (filter, len * 2 + 6, FALSE);
+               g_mime_filter_set_size (filter, GMIME_BASE64_ENCODE_LEN (len), 
FALSE);
                outbuf = (unsigned char *) filter->outbuf;
                inbuf = (const unsigned char *) in;
                newlen = g_mime_utils_base64_encode_step (inbuf, len, outbuf, 
&basic->state, &basic->save);
-               g_assert (newlen <= len * 2 + 6);
+               g_assert (newlen <= GMIME_BASE64_ENCODE_LEN (len));
                break;
        case GMIME_FILTER_BASIC_QP_ENC:
-               /* *4 is overly conservative, but will do */
-               g_mime_filter_set_size (filter, len * 4 + 4, FALSE);
+               g_mime_filter_set_size (filter, GMIME_QP_ENCODE_LEN (len), 
FALSE);
                outbuf = (unsigned char *) filter->outbuf;
                inbuf = (const unsigned char *) in;
                newlen = g_mime_utils_quoted_encode_step (inbuf, len, outbuf, 
&basic->state, &basic->save);
-               g_assert (newlen <= len * 4 + 4);
+               g_assert (newlen <= GMIME_QP_ENCODE_LEN (len));
                break;
        case GMIME_FILTER_BASIC_UU_ENC:
-               /* won't go to more than 2 * (x + 2) + 62 */
-               g_mime_filter_set_size (filter, (len + 2) * 2 + 62, FALSE);
+               g_mime_filter_set_size (filter, GMIME_UUENCODE_LEN (len), 
FALSE);
                outbuf = (unsigned char *) filter->outbuf;
                inbuf = (const unsigned char *) in;
                newlen = g_mime_utils_uuencode_step (inbuf, len, outbuf, 
basic->uubuf, &basic->state,
                                                     &basic->save);
-               g_assert (newlen <= (len + 2) * 2 + 62);
+               g_assert (newlen <= GMIME_UUENCODE_LEN (len));
                break;
        case GMIME_FILTER_BASIC_BASE64_DEC:
                /* output can't possibly exceed the input size */

Modified: trunk/gmime/gmime-utils.c
==============================================================================
--- trunk/gmime/gmime-utils.c   (original)
+++ trunk/gmime/gmime-utils.c   Sun Feb 10 00:34:28 2008
@@ -2066,7 +2066,7 @@
        
        switch (g_mime_utils_best_encoding ((const unsigned char *) word, len)) 
{
        case GMIME_PART_ENCODING_BASE64:
-               enclen = BASE64_ENCODE_LEN (len);
+               enclen = GMIME_BASE64_ENCODE_LEN (len);
                encoded = g_alloca (enclen + 1);
                
                encoding = 'b';
@@ -2089,7 +2089,7 @@
                
                break;
        case GMIME_PART_ENCODING_QUOTEDPRINTABLE:
-               enclen = QP_ENCODE_LEN (len);
+               enclen = GMIME_QP_ENCODE_LEN (len);
                encoded = g_alloca (enclen + 1);
                
                encoding = 'q';
@@ -2613,7 +2613,7 @@
        const register unsigned char *inptr;
        register unsigned char *outptr;
        
-       if (inlen <= 0)
+       if (inlen == 0)
                return 0;
        
        inptr = in;

Modified: trunk/gmime/gmime-utils.h
==============================================================================
--- trunk/gmime/gmime-utils.h   (original)
+++ trunk/gmime/gmime-utils.h   Sun Feb 10 00:34:28 2008
@@ -70,8 +70,43 @@
 };
 
 
-#define BASE64_ENCODE_LEN(x) ((size_t) ((x) * 5 / 3) + 4)  /* conservative 
would be ((x * 4 / 3) + 4) */
-#define QP_ENCODE_LEN(x)     ((size_t) ((x) * 7 / 2) + 4)  /* conservative 
would be ((x * 3) + 4) */
+/**
+ * GMIME_BASE64_ENCODE_LEN:
+ * @x: Length of the input data to encode
+ *
+ * Calculates the maximum number of bytes needed to base64 encode the
+ * full input buffer of length @x.
+ *
+ * Returns the number of output bytes needed to base64 encode an input
+ * buffer of size @x.
+ **/
+#define GMIME_BASE64_ENCODE_LEN(x) ((size_t) (((((x) + 2) / 57) * 77) + 77))
+
+
+/**
+ * GMIME_QP_ENCODE_LEN:
+ * @x: Length of the input data to encode
+ *
+ * Calculates the maximum number of bytes needed to encode the full
+ * input buffer of length @x using the quoted-printable encoding.
+ *
+ * Returns the number of output bytes needed to encode an input buffer
+ * of size @x using the quoted-printable encoding.
+ **/
+#define GMIME_QP_ENCODE_LEN(x)     ((size_t) (((x) + 1) * 3))
+
+
+/**
+ * GMIME_UUENCODE_LEN:
+ * @x: Length of the input data to encode
+ *
+ * Calculates the maximum number of bytes needed to uuencode the full
+ * input buffer of length @x.
+ *
+ * Returns the number of output bytes needed to uuencode an input
+ * buffer of size @x.
+ **/
+#define GMIME_UUENCODE_LEN(x)      ((size_t) (((((x) + 2) / 45) * 62) + 62))
 
 
 /**
_______________________________________________
SVN-commits-list mailing list (read only)
http://mail.gnome.org/mailman/listinfo/svn-commits-list

Want to limit the commits to a few modules? Go to above URL, log in to edit 
your options and select the modules ('topics') you want.
Module maintainer? It is possible to set the reply-to to your development 
mailing list. Email [EMAIL PROTECTED] if interested.

Reply via email to