]> diplodocus.org Git - nmh/commitdiff
I think we're very close to get address encoding working, but still have
authorKen Hornstein <kenh@pobox.com>
Mon, 2 Dec 2013 20:49:35 +0000 (15:49 -0500)
committerKen Hornstein <kenh@pobox.com>
Mon, 2 Dec 2013 20:49:35 +0000 (15:49 -0500)
to test it more.

sbr/encode_rfc2047.c

index 3c4f45e57220cfcb000dff948ed734744e285a00..0df5f7064cb4cf82a79ec2c7d3a79e42b973c029 100644 (file)
@@ -544,7 +544,7 @@ field_encode_address(const char *name, char **value, int encoding,
     int asciichars, specialchars, eightbitchars, reformat = 0, errflag = 0;
     int retval;
     size_t len;
     int asciichars, specialchars, eightbitchars, reformat = 0, errflag = 0;
     int retval;
     size_t len;
-    char *mp, *output = NULL;
+    char *mp, *cp = NULL, *output = NULL;
     char *tmpbuf = NULL;
     size_t tmpbufsize = 0;
     struct mailname *mn;
     char *tmpbuf = NULL;
     size_t tmpbufsize = 0;
     struct mailname *mn;
@@ -569,6 +569,8 @@ field_encode_address(const char *name, char **value, int encoding,
            continue;
        }
 
            continue;
        }
 
+       reformat = 0;
+
        /*
         * We only care if the phrase (m_pers) or any trailing comment
         * (m_note) have 8-bit characters.  If doing q-p, we also need
        /*
         * We only care if the phrase (m_pers) or any trailing comment
         * (m_note) have 8-bit characters.  If doing q-p, we also need
@@ -681,15 +683,94 @@ field_encode_address(const char *name, char **value, int encoding,
            }
 
            reformat++;
            }
 
            reformat++;
+
+           /*
+            * Make sure the size of tmpbuf is correct (it always gets
+            * reallocated in the above functions).
+            */
+
+           tmpbufsize = strlen(tmpbuf) + 1;
+
+           /*
+            * Put the note field back surrounded by parenthesis.
+            */
+
+           mn->m_note = mh_xrealloc(mn->m_note, tmpbufsize + 2);
+
+           snprintf(mn->m_note, tmpbufsize + 2, "(%s)", tmpbuf);
+       }
+
+do_reformat:
+
+       /*
+        * So, some explanation is in order.
+        *
+        * We know we need to rewrite at least one address in the header,
+        * otherwise we wouldn't be here.  If we had to reformat this
+        * particular address, then run it through adrformat().  Otherwise
+        * we can use m_text directly.
+        */
+
+       if (reformat) {
+           if (mn->m_gname) {
+               cp = add(mn->m_gname, NULL);
+           }
+           cp = add(adrformat(mn), cp);
+       } else {
+           cp = add(mn->m_text, NULL);
        }
 
        }
 
+       len = strlen(cp);
 
 
+       /*
+        * If we're not at the beginning of the line, add a command and
+        * either a space or a newline.
+        */
+
+       if (column != prefixlen) {
+           if (len + column + 2 > OUTPUTLINELEN) {
+
+               if ((size_t) (prefixlen + 3) < tmpbufsize)
+                   tmpbuf = mh_xrealloc(tmpbuf, tmpbufsize = prefixlen + 3);
+
+               snprintf(tmpbuf, tmpbufsize, ",\n%*s", column = prefixlen, "");
+               output = add(tmpbuf, output);
+           } else {
+               output = add(", ", output);
+               column += 2;
+           }
+       }
+
+       /*
+        * Finally add the address
+        */
+
+       output = add(cp, output);
+       column += len;
+       free(cp);
+       cp = NULL;
+
+       /*
+        * If we were in a group but are no longer, make sure we add a
+        * trailing semicolon.
+        */
+
+       if (groupflag && ! mn->m_ingrp) {
+           output = add(";", output);
+       }
+
+       groupflag = mn->m_ingrp;
     }
 
     }
 
+   *value = output;
+   output = NULL;
+
 out:
 
     if (tmpbuf)
        free(tmpbuf);
 out:
 
     if (tmpbuf)
        free(tmpbuf);
+    if (output)
+       free(output);
 
     return errflag > 0;
 }
 
     return errflag > 0;
 }