]> diplodocus.org Git - nmh/blobdiff - uip/mhbuild.c
Hard-code the config/version.c target, instead of using $@, so its
[nmh] / uip / mhbuild.c
index 1e862909dc8a9f028ef7c889a7a92f190d3fdb71..ef4598581702e8c0773a33b66fca14b2871319cd 100644 (file)
@@ -11,8 +11,6 @@
 #include <fcntl.h>
 #include <h/signals.h>
 #include <h/md5.h>
 #include <fcntl.h>
 #include <h/signals.h>
 #include <h/md5.h>
-#include <errno.h>
-#include <signal.h>
 #include <h/mts.h>
 #include <h/tws.h>
 #include <h/mime.h>
 #include <h/mts.h>
 #include <h/tws.h>
 #include <h/mime.h>
 #include <h/mhcachesbr.h>
 #include <h/utils.h>
 
 #include <h/mhcachesbr.h>
 #include <h/utils.h>
 
-#ifdef HAVE_SYS_WAIT_H
-# include <sys/wait.h>
-#endif
-
-static struct swit switches[] = {
-#define        CHECKSW                 0
-    { "check", 0 },
-#define        NCHECKSW                1
-    { "nocheck", 0 },
-#define        EBCDICSW                2
-    { "ebcdicsafe", 0 },
-#define        NEBCDICSW               3
-    { "noebcdicsafe", 0 },
-#define        HEADSW                  4
-    { "headers", 0 },
-#define        NHEADSW                 5
-    { "noheaders", 0 },
-#define        LISTSW                  6
-    { "list", 0 },
-#define        NLISTSW                 7
-    { "nolist", 0 },
-#define        SIZESW                  8
-    { "realsize", 0 },
-#define        NSIZESW                 9
-    { "norealsize", 0 },
-#define        RFC934SW               10
-    { "rfc934mode", 0 },
-#define        NRFC934SW              11
-    { "norfc934mode", 0 },
-#define        VERBSW                 12
-    { "verbose", 0 },
-#define        NVERBSW                13
-    { "noverbose", 0 },
-#define        RCACHESW               14
-    { "rcache policy", 0 },
-#define        WCACHESW               15
-    { "wcache policy", 0 },
-#define        CONTENTIDSW            16
-    { "contentid", 0 },
-#define        NCONTENTIDSW           17
-    { "nocontentid", 0 },
-#define VERSIONSW              18
-    { "version", 0 },
-#define        HELPSW                 19
-    { "help", 0 },
-#define        DEBUGSW                20
-    { "debug", -5 },
-    { NULL, 0 }
-};
-
+#define MHBUILD_SWITCHES \
+    X("check", 0, CHECKSW) \
+    X("nocheck", 0, NCHECKSW) \
+    X("directives", 0, DIRECTIVES) \
+    X("nodirectives", 0, NDIRECTIVES) \
+    X("headers", 0, HEADSW) \
+    X("noheaders", 0, NHEADSW) \
+    X("list", 0, LISTSW) \
+    X("nolist", 0, NLISTSW) \
+    X("realsize", 0, SIZESW) \
+    X("norealsize", 0, NSIZESW) \
+    X("rfc934mode", 0, RFC934SW) \
+    X("norfc934mode", 0, NRFC934SW) \
+    X("verbose", 0, VERBSW) \
+    X("noverbose", 0, NVERBSW) \
+    X("rcache policy", 0, RCACHESW) \
+    X("wcache policy", 0, WCACHESW) \
+    X("contentid", 0, CONTENTIDSW) \
+    X("nocontentid", 0, NCONTENTIDSW) \
+    X("headerencoding encoding-algorithm", 0, HEADERENCSW) \
+    X("autoheaderencoding", 0, AUTOHEADERENCSW) \
+    X("version", 0, VERSIONSW) \
+    X("help", 0, HELPSW) \
+    X("debug", -5, DEBUGSW) \
+
+#define X(sw, minchars, id) id,
+DEFINE_SWITCH_ENUM(MHBUILD);
+#undef X
+
+#define X(sw, minchars, id) { sw, minchars, id },
+DEFINE_SWITCH_ARRAY(MHBUILD, switches);
+#undef X
+
+#define MIMEENCODING_SWITCHES \
+    X("base64", 0, BASE64SW) \
+    X("quoted-printable", 0, QUOTEDPRINTSW) \
+
+#define X(sw, minchars, id) id,
+DEFINE_SWITCH_ENUM(MIMEENCODING);
+#undef X
+
+#define X(sw, minchars, id) { sw, minchars, id },
+DEFINE_SWITCH_ARRAY(MIMEENCODING, encodingswitches);
+#undef X
 
 /* mhbuildsbr.c */
 extern char *tmp;      /* directory to place temp files */
 
 /* mhbuildsbr.c */
 extern char *tmp;      /* directory to place temp files */
@@ -83,7 +75,6 @@ extern char *cache_private;
 int debugsw = 0;
 int verbosw = 0;
 
 int debugsw = 0;
 int verbosw = 0;
 
-int ebcdicsw = 0;
 int listsw   = 0;
 int rfc934sw = 0;
 int contentidsw = 1;
 int listsw   = 0;
 int rfc934sw = 0;
 int contentidsw = 1;
@@ -100,24 +91,17 @@ static int unlink_outfile = 0;
 static void unlink_done (int) NORETURN;
 
 /* mhbuildsbr.c */
 static void unlink_done (int) NORETURN;
 
 /* mhbuildsbr.c */
-CT build_mime (char *);
 int output_message (CT, char *);
 int output_message_fp (CT, FILE *, char*);
 
 /* mhlistsbr.c */
 int list_all_messages (CT *, int, int, int, int);
 
 int output_message (CT, char *);
 int output_message_fp (CT, FILE *, char*);
 
 /* mhlistsbr.c */
 int list_all_messages (CT *, int, int, int, int);
 
-/* mhmisc.c */
-void set_endian (void);
-
-/* mhfree.c */
-void free_content (CT);
-
 
 int
 main (int argc, char **argv)
 {
 
 int
 main (int argc, char **argv)
 {
-    int sizesw = 1, headsw = 1;
+    int sizesw = 1, headsw = 1, directives = 1;
     int *icachesw;
     char *cp, buf[BUFSIZ];
     char buffer[BUFSIZ], *compfile = NULL;
     int *icachesw;
     char *cp, buf[BUFSIZ];
     char buffer[BUFSIZ], *compfile = NULL;
@@ -125,6 +109,7 @@ main (int argc, char **argv)
     CT ct, cts[2];
     FILE *fp = NULL;
     FILE *fp_out = NULL;
     CT ct, cts[2];
     FILE *fp = NULL;
     FILE *fp_out = NULL;
+    int header_encoding = CE_UNKNOWN;
 
     done=unlink_done;
 
 
     done=unlink_done;
 
@@ -160,10 +145,10 @@ main (int argc, char **argv)
            case HELPSW: 
                snprintf (buf, sizeof(buf), "%s [switches] file", invo_name);
                print_help (buf, switches, 1);
            case HELPSW: 
                snprintf (buf, sizeof(buf), "%s [switches] file", invo_name);
                print_help (buf, switches, 1);
-               done (1);
+               done (0);
            case VERSIONSW:
                print_version(invo_name);
            case VERSIONSW:
                print_version(invo_name);
-               done (1);
+               done (0);
 
            case RCACHESW:
                icachesw = &rcachesw;
 
            case RCACHESW:
                icachesw = &rcachesw;
@@ -191,13 +176,6 @@ main (int argc, char **argv)
                checksw = 0;
                continue;
 
                checksw = 0;
                continue;
 
-           case EBCDICSW:
-               ebcdicsw++;
-               continue;
-           case NEBCDICSW:
-               ebcdicsw = 0;
-               continue;
-
            case HEADSW:
                headsw++;
                continue;
            case HEADSW:
                headsw++;
                continue;
@@ -205,6 +183,13 @@ main (int argc, char **argv)
                headsw = 0;
                continue;
 
                headsw = 0;
                continue;
 
+           case DIRECTIVES:
+               directives = 1;
+               continue;
+           case NDIRECTIVES:
+               directives = 0;
+               continue;
+
            case LISTSW:
                listsw++;
                continue;
            case LISTSW:
                listsw++;
                continue;
@@ -233,6 +218,33 @@ main (int argc, char **argv)
                contentidsw = 0;
                continue;
 
                contentidsw = 0;
                continue;
 
+           case HEADERENCSW: {
+               int encoding;
+
+               if (!(cp = *argp++) || *cp == '-')
+                   adios (NULL, "missing argument to %s", argp[-2]);
+               switch (encoding = smatch (cp, encodingswitches)) {
+               case AMBIGSW:
+                   ambigsw (cp, encodingswitches);
+                   done (1);
+               case UNKWNSW:
+                   adios (NULL, "%s unknown encoding algorithm", cp);
+               case BASE64SW:
+                   header_encoding = CE_BASE64;
+                   break;
+               case QUOTEDPRINTSW:
+                   header_encoding = CE_QUOTED;
+                   break;
+               default:
+                   adios (NULL, "Internal error: algorithm %s", cp);
+               }
+               continue;
+           }
+
+           case AUTOHEADERENCSW:
+               header_encoding = CE_UNKNOWN;
+               continue;
+
            case VERBSW: 
                verbosw++;
                continue;
            case VERBSW: 
                verbosw++;
                continue;
@@ -250,11 +262,6 @@ main (int argc, char **argv)
            compfile = cp;
     }
 
            compfile = cp;
     }
 
-    set_endian ();
-
-    if ((cp = getenv ("MM_NOASK")) && !strcmp (cp, "1"))
-       listsw  = 0;
-
     /*
      * Check if we've specified an additional profile
      */
     /*
      * Check if we've specified an additional profile
      */
@@ -313,7 +320,7 @@ main (int argc, char **argv)
        unlink_infile = 1;
 
        /* build the content structures for MIME message */
        unlink_infile = 1;
 
        /* build the content structures for MIME message */
-       ct = build_mime (infile);
+       ct = build_mime (infile, directives, header_encoding);
        cts[0] = ct;
        cts[1] = NULL;
 
        cts[0] = ct;
        cts[1] = NULL;
 
@@ -347,7 +354,7 @@ main (int argc, char **argv)
      */
 
     /* build the content structures for MIME message */
      */
 
     /* build the content structures for MIME message */
-    ct = build_mime (compfile);
+    ct = build_mime (compfile, directives, header_encoding);
     cts[0] = ct;
     cts[1] = NULL;
 
     cts[0] = ct;
     cts[1] = NULL;