X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/2f689a1cb907a5de04e6d39ffd217a69af3216c7..70a3fbf967717678e2edd0fb2c992e5a2c59a2b0:/uip/mhbuild.c diff --git a/uip/mhbuild.c b/uip/mhbuild.c index fbe2b2c6..ef459858 100644 --- a/uip/mhbuild.c +++ b/uip/mhbuild.c @@ -2,8 +2,6 @@ /* * mhbuild.c -- expand/translate MIME composition files * - * $Id$ - * * This code is Copyright (c) 2002, by the authors of nmh. See the * COPYRIGHT file in the root directory of the nmh distribution for * complete copyright information. @@ -13,8 +11,6 @@ #include #include #include -#include -#include #include #include #include @@ -22,56 +18,50 @@ #include #include -#ifdef HAVE_SYS_WAIT_H -# include -#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 */ @@ -85,7 +75,6 @@ extern char *cache_private; int debugsw = 0; int verbosw = 0; -int ebcdicsw = 0; int listsw = 0; int rfc934sw = 0; int contentidsw = 1; @@ -102,24 +91,17 @@ static int unlink_outfile = 0; 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); -/* mhmisc.c */ -void set_endian (void); - -/* mhfree.c */ -void free_content (CT); - 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; @@ -127,6 +109,7 @@ main (int argc, char **argv) CT ct, cts[2]; FILE *fp = NULL; FILE *fp_out = NULL; + int header_encoding = CE_UNKNOWN; done=unlink_done; @@ -162,10 +145,10 @@ main (int argc, char **argv) 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); - done (1); + done (0); case RCACHESW: icachesw = &rcachesw; @@ -193,13 +176,6 @@ main (int argc, char **argv) checksw = 0; continue; - case EBCDICSW: - ebcdicsw++; - continue; - case NEBCDICSW: - ebcdicsw = 0; - continue; - case HEADSW: headsw++; continue; @@ -207,6 +183,13 @@ main (int argc, char **argv) headsw = 0; continue; + case DIRECTIVES: + directives = 1; + continue; + case NDIRECTIVES: + directives = 0; + continue; + case LISTSW: listsw++; continue; @@ -235,6 +218,33 @@ main (int argc, char **argv) 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; @@ -252,11 +262,6 @@ main (int argc, char **argv) compfile = cp; } - set_endian (); - - if ((cp = getenv ("MM_NOASK")) && !strcmp (cp, "1")) - listsw = 0; - /* * Check if we've specified an additional profile */ @@ -315,7 +320,7 @@ main (int argc, char **argv) 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; @@ -349,7 +354,7 @@ main (int argc, char **argv) */ /* build the content structures for MIME message */ - ct = build_mime (compfile); + ct = build_mime (compfile, directives, header_encoding); cts[0] = ct; cts[1] = NULL;