Add %(unmailto) format function for List-Post headers
[mmh] / sbr / fmt_scan.c
index 8414829..9ad7b8a 100644 (file)
@@ -14,6 +14,8 @@
 #include <h/fmt_scan.h>
 #include <h/tws.h>
 #include <h/fmt_compile.h>
+#include <ctype.h>
+#include <sysexits.h>
 
 #ifdef HAVE_SYS_TIME_H
 # include <sys/time.h>
@@ -25,8 +27,6 @@
 #  include <wchar.h>
 #endif
 
-extern char *formataddr();  /* hook for custom address formatting */
-
 extern int fmt_norm;  /* defined in sbr/fmt_def.c = AD_NAME */
 struct mailname fmt_mnull;
 
@@ -324,7 +324,7 @@ fmt_scan(struct format *format, char *scanl, int width, int *dat)
                        cptrimmed(&cp, str, fmt->f_width, fmt->f_fill, ep - cp);
                        break;
                case FT_STRFW:
-                       adios(NULL, "internal error (FT_STRFW)");
+                       adios(EX_SOFTWARE, NULL, "internal error (FT_STRFW)");
 
                case FT_NUM:
                        n = snprintf(cp, ep - cp + 1, "%d", value);
@@ -679,7 +679,7 @@ fmt_scan(struct format *format, char *scanl, int width, int *dat)
                                                } else
                                                        str = mn->m_text;
                                                break;
-                                 }
+                                       }
                                }
                        }
                        break;
@@ -688,32 +688,10 @@ fmt_scan(struct format *format, char *scanl, int width, int *dat)
                /* UNQUOTEs RFC-2822 quoted-string and quoted-pair */
                case FT_LS_UNQUOTE:
                        if (str) {
-                               int m;
                                strncpy(buffer, str, sizeof(buffer));
                                /* strncpy doesn't NUL-terminate if it fills the buffer */
                                buffer[sizeof(buffer)-1] = '\0';
-                               str = buffer;
-
-                               /* we will parse from buffer to buffer2 */
-                               n = 0; /* n is the input position in str */
-                               m = 0; /* m is the ouput position in buffer2 */
-
-                               while ( str[n] != '\0') {
-                                       switch ( str[n] ) {
-                                       case '\\':
-                                               n++;
-                                               if ( str[n] != '\0')
-                                                       buffer2[m++] = str[n++];
-                                               break;
-                                       case '"':
-                                               n++;
-                                               break;
-                                       default:
-                                               buffer2[m++] = str[n++];
-                                               break;
-                                       }
-                               }
-                               buffer2[m] = '\0';
+                               unquote_string(buffer, buffer2);
                                str = buffer2;
                        }
                        break;
@@ -776,16 +754,17 @@ fmt_scan(struct format *format, char *scanl, int width, int *dat)
                        indent = strlen(sp);
                        wid -= indent;
                        if (wid <= 0) {
-                               adios(NULL, "putaddr -- num register (%d) "
+                               adios(EX_SOFTWARE, NULL, "putaddr -- num register (%d) "
                                                "must be greater than label "
                                                "width (%d)", value, indent);
                        }
                        while( (c = *sp++) && cp < ep)
                                *cp++ = c;
                        while (len > wid) {
-                               /* try to break at a comma; failing that,
-                                * break at a space.
-                                */
+                               /*
+                               ** try to break at a comma; failing that,
+                               ** break at a space.
+                               */
                                lastb = 0; sp = lp + wid;
                                while (sp > lp && (c = *--sp) != ',') {
                                        if (! lastb && isspace(c))
@@ -867,6 +846,20 @@ fmt_scan(struct format *format, char *scanl, int width, int *dat)
                        }
                        break;
 
+               case FT_LS_UNMAILTO:
+                       if (!str) {
+                               break;
+                       }
+                       str = trim(str);
+                       if (*str == '<' && str[strlen(str)-1] == '>') {
+                               str++;
+                               str[strlen(str)-1] = '\0';
+                       }
+                       if (strncmp("mailto:", str, 7)==0) {
+                               str += 7;
+                       }
+                       break;
+
                }
                fmt++;
        }