nmh-workers
[Top] [All Lists]

Re: [Nmh-workers] scan or show of UTF-encoded headers?

2005-02-14 15:13:46
it seems that this patch relies on other local changes you've
made to your tree -- i went searching for "get_charset" with google,
and came up with a message you sent to this list on january 24
which contained such a routine, in different mime-related patch.  :-)

paul

i guess i was thinking of a wrapper for scan or show that took care
of setting up the locale and charset, either via argument for manually
choosing, or maybe even by examining the message and then figuring out
what locale/charset it should probably use, this time.

It's probably easier to hack the C code. I've had a quick go at
producing something which uses iconv to convert stuff to the native
character set (patch is below). Would be good if you could try this out
and look for ways to improve it.

I've not thought through what the between_encodings stuff is doing and
if that is affected at all. If this is going to be turned into something
we can commit to CVS, we also need to work out the necessary configure
stuff for iconv. As it is, you may need to fiddle the Makefile to get
this to compile.

Oliver

Index: h/prototypes.h
===================================================================
RCS file: /cvsroot/nmh/nmh/h/prototypes.h,v
retrieving revision 1.9
diff -u -r1.9 prototypes.h
--- h/prototypes.h   27 Jan 2005 16:26:24 -0000      1.9
+++ h/prototypes.h   14 Feb 2005 18:18:38 -0000
@@ -61,6 +61,7 @@
 char **getans (char *, struct swit *);
 int getanswer (char *);
 char **getarguments (char *, int, char **, int);
+char *get_charset();
 char *getcpy (char *);
 char *getfolder(int);
 int lkclose(int, char*);
Index: sbr/fmt_rfc2047.c
===================================================================
RCS file: /cvsroot/nmh/nmh/sbr/fmt_rfc2047.c,v
retrieving revision 1.2
diff -u -r1.2 fmt_rfc2047.c
--- sbr/fmt_rfc2047.c        2 Jul 2002 22:09:14 -0000       1.2
+++ sbr/fmt_rfc2047.c        14 Feb 2005 18:18:38 -0000
@@ -10,6 +10,7 @@
  */
 
 #include <h/mh.h>
+#include <iconv.h>
 
 static signed char hexindex[] = {
     -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
@@ -97,6 +98,10 @@
 
     /* Check for initial =? */
     if (*p == '=' && p[1] && p[1] == '?' && p[2]) {
+        int use_iconv = 0;
+        iconv_t cd;
+        char *saveq, *convbuf;
+
         startofmime = p + 2;
 
         /* Scan ahead for the next '?' character */
@@ -106,9 +111,14 @@
         if (!*pp)
             continue;
 
-        /* Check if character set is OK */
-        if (!check_charset(startofmime, pp - startofmime))
-            continue;
+        /* Check if character set can be handled natively */
+        if (!check_charset(startofmime, pp - startofmime)) {
+            use_iconv = 1;
+            *pp = '\0';
+            cd = iconv_open(get_charset(), startofmime);
+            *pp = '?';
+                if (cd == (iconv_t)-1) continue;
+        }
 
         startofmime = pp + 1;
 
@@ -159,6 +169,12 @@
         if (between_encodings)
             q -= whitespace;
 
+        if (use_iconv) {
+            saveq = q;
+            if (!(q = convbuf = (char *)malloc(endofmime - startofmime)))
+                continue;
+            }
+
         /* Now decode the text */
         if (quoted_printable) {
             for (pp = startofmime; pp < endofmime; pp++) {
@@ -218,6 +234,15 @@
             }
         }
 
+        if (use_iconv) {
+            size_t inbytes = q - convbuf, outbytes = BUFSIZ;
+            char *start = convbuf;
+            iconv(cd, &start, &inbytes, &saveq, &outbytes);
+            q = saveq;
+            iconv_close(cd);
+            free(convbuf);
+        }
+        
         /*
          * Now that we are done decoding this particular
          * encoded word, advance string to trailing '='.


_______________________________________________
Nmh-workers mailing list
Nmh-workers(_at_)nongnu(_dot_)org
http://lists.nongnu.org/mailman/listinfo/nmh-workers

=---------------------
 paul fox, pgf(_at_)foxharp(_dot_)boston(_dot_)ma(_dot_)us (arlington, ma, 
where it's 31.3 degrees)


_______________________________________________
Nmh-workers mailing list
Nmh-workers(_at_)nongnu(_dot_)org
http://lists.nongnu.org/mailman/listinfo/nmh-workers

<Prev in Thread] Current Thread [Next in Thread>