tAdd charset guessing. This is lame but does it for sure. - rohrpost - A commandline mail client to change the world as we see it.
 (HTM) git clone git://r-36.net/rohrpost
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) LICENSE
       ---
 (DIR) commit 138f1bf78d0f6f4cea849b9ef87268811c4b8b90
 (DIR) parent 5c204376213ec37399d68aca4abd0abfea2366bd
 (HTM) Author: Christoph Lohmann <20h@r-36.net>
       Date:   Tue, 21 Aug 2012 16:22:45 +0200
       
       Add charset guessing. This is lame but does it for sure.
       
       Diffstat:
         bin/rpopen                          |       2 +-
         bin/rpsyncmail                      |       2 +-
         meta.c                              |       2 +-
         mime.c                              |      65 +++++++++++++++++++++++++++++--
         mime.h                              |       1 +
         scan.c                              |       8 ++++----
         util.c                              |       2 +-
         view.c                              |       4 ++--
       
       8 files changed, 73 insertions(+), 13 deletions(-)
       ---
 (DIR) diff --git a/bin/rpopen b/bin/rpopen
       t@@ -15,7 +15,7 @@ fi
        
        msgid="$*"
        
       -url=`rpview $msgid | awk '/URL:/ {print $2}' | tr -d '\r'`
       +url=`rpview $msgid | awk '/^URL:/ {print $2}' | tr -d '\r'`
        for i in $url
        do
                echo $i
 (DIR) diff --git a/bin/rpsyncmail b/bin/rpsyncmail
       t@@ -1,6 +1,6 @@
        #!/bin/sh
        
       -if [ "$1" = "mb" ];
       +if [ "$1" = "mb" ] || [ $# -eq 0 ];
        then
                dsync -R -u chrissi mirror chrissi@r-36.net
        else
 (DIR) diff --git a/meta.c b/meta.c
       t@@ -73,7 +73,7 @@ meta_headers2meta(mime_t *mime)
        
                rhdr = llist_new();
                forllist(meta->hdrs, header) {
       -                enc = mime_decodeheader(header->data);
       +                enc = mime_guessheader(header->data);
                        if (enc == NULL)
                                continue;
        
 (DIR) diff --git a/mime.c b/mime.c
       t@@ -295,6 +295,65 @@ mime_decodeheader(char *value)
                return ret;
        }
        
       +char *cstries[] = {
       +        "utf-8",
       +        "iso-8859-1",
       +        "windows-1252",
       +        "Shift_JIS",
       +        "Big5",
       +        "iso-8859-15",
       +        NULL
       +};
       +
       +char *
       +mime_guesscharset(char *str)
       +{
       +        int i, eq;
       +        char *itry;
       +
       +        for (i = 0; i < nelem(cstries); i++) {
       +                itry = mime_iconv(str, cstries[i], cstries[i]);
       +                if (itry == NULL)
       +                        continue;
       +                eq = strcmp(str, itry);
       +                free(itry);
       +                if (!eq)
       +                        break;
       +        }
       +
       +        return cstries[i];
       +}
       +
       +char *
       +mime_guessheader(char *value)
       +{
       +        char *nvalue, *gcs;
       +
       +        gcs = NULL;
       +
       +        nvalue = value;
       +        if (!strisascii(value)) {
       +                /*
       +                 * Guessing begins. Some major MUA developers did not read any
       +                 * RFCs.
       +                 */
       +
       +                gcs = mime_guesscharset(value);
       +                if (gcs != NULL) {
       +                        nvalue = mime_iconv(value, gcs, "utf-8");
       +                        if (nvalue == NULL) {
       +                                nvalue = value;
       +                                gcs = NULL;
       +                        }
       +                }
       +        }
       +
       +        value  = mime_decodeheader(nvalue);
       +        if (gcs != NULL)
       +                free(nvalue);
       +        return value;
       +}
       +
        char *
        mime_decodeparam(char *value)
        {
       t@@ -1173,7 +1232,7 @@ mime_filename(mime_t *mime)
                        if (hdrp != NULL) {
                                name = llist_ciget(hdrp, "filename");
                                if (name != NULL && name->data != NULL) {
       -                                filename = mime_decodeheader(
       +                                filename = mime_guessheader(
                                                        (char *)name->data);
                                }
                        }
       t@@ -1192,7 +1251,7 @@ mime_filename(mime_t *mime)
                        if (hdrp != NULL) {
                                name = llist_ciget(hdrp, "name");
                                if (name != NULL && name->data != NULL) {
       -                                filename = mime_decodeheader(
       +                                filename = mime_guessheader(
                                                        (char *)name->data);
                                }
                        }
       t@@ -1221,7 +1280,7 @@ mime_mkfilename(char *id, mime_t *mime)
                 */
                hdr = llist_ciget(mime->hdrs, "Content-Description");
                if (hdr != NULL && hdr->data != NULL) {
       -                filename = mime_decodeheader((char *)hdr->data);
       +                filename = mime_guessheader((char *)hdr->data);
                        if (filename != NULL)
                                return filename;
                }
 (DIR) diff --git a/mime.h b/mime.h
       t@@ -36,6 +36,7 @@ char *mime_iconv(char *str, char *from, char *to);
        char *mime_decodeheaderext(char *value);
        int mime_isextws(char *str, int len);
        char *mime_decodeheader(char *value);
       +char *mime_guessheader(char *value);
        char *mime_decodeparam(char *value);
        char *mime_encodestring(char *value);
        char *mime_encodeheader(char *header, char *value);
 (DIR) diff --git a/scan.c b/scan.c
       t@@ -93,7 +93,7 @@ scanmain(int argc, char *argv[])
                        frome = llist_ciget(mime->hdrs, "from");
        
                        if (subjecte != NULL) {
       -                        subject = mime_decodeheader((char *)subjecte->data);
       +                        subject = mime_guessheader((char *)subjecte->data);
                        } else {
                                subject = "<empty>";
                        }
       t@@ -110,7 +110,7 @@ scanmain(int argc, char *argv[])
                        }
        
                        if (frome != NULL) {
       -                        from = mime_decodeheader((char *)frome->data);
       +                        from = mime_guessheader((char *)frome->data);
                        } else {
                                from = "<empty>";
                        }
       t@@ -165,7 +165,7 @@ scanmain(int argc, char *argv[])
                        id = (char *)ide->data;
        
                        if (subjecte != NULL) {
       -                        subject = mime_decodeheader((char *)subjecte->data);
       +                        subject = mime_guessheader((char *)subjecte->data);
                        } else {
                                subject = "<empty>";
                        }
       t@@ -182,7 +182,7 @@ scanmain(int argc, char *argv[])
                        }
        
                        if (frome != NULL) {
       -                        from = mime_decodeheader((char *)frome->data);
       +                        from = mime_guessheader((char *)frome->data);
                        } else {
                                from = "<empty>";
                        }
 (DIR) diff --git a/util.c b/util.c
       t@@ -71,7 +71,7 @@ utilmain(int argc, char *argv[])
                        ress = mime_encodestring(works);
                        printf("%s", ress);
                } else if (status & DECODE) {
       -                ress = mime_decodeheader(works);
       +                ress = mime_guessheader(works);
                        printf("%s", ress);
                } else {
                        free(works);
 (DIR) diff --git a/view.c b/view.c
       t@@ -141,7 +141,7 @@ view_printpart(char *id, mime_t *mime, llist_t *dhdrs, llist_t *partl,
                        didprint = 0;
                        if (!strcasecmp(dhdrs->first->key, "all")) {
                                forllist(mime->hdrs, helem) {
       -                                hvalue = mime_decodeheader((char *)helem->data);
       +                                hvalue = mime_guessheader((char *)helem->data);
                                        if (hvalue == NULL)
                                                continue;
                                        if (options & PRINT_VALUE) {
       t@@ -157,7 +157,7 @@ view_printpart(char *id, mime_t *mime, llist_t *dhdrs, llist_t *partl,
                                        hlist = llist_cifind(mime->hdrs, delem->key);
                                        if (hlist != NULL) {
                                                forllist(hlist, helem) {
       -                                                hvalue = mime_decodeheader(
       +                                                hvalue = mime_guessheader(
                                                                        (char *)helem->data);
                                                        if (hvalue == NULL)
                                                                continue;