Removed some dead code, all inside #if 0's. I tried to not remove
[mmh] / uip / mhbuildsbr.c
index a36941f..ec2c195 100644 (file)
 #include <h/mhparse.h>
 #include <h/utils.h>
 
-#ifdef TIME_WITH_SYS_TIME
+#ifdef HAVE_SYS_TIME_H
 # include <sys/time.h>
-# include <time.h>
-#else
-# ifdef TM_IN_SYS_TIME
-#  include <sys/time.h>
-# else
-#  include <time.h>
-# endif
 #endif
+#include <time.h>
 
 
 extern int debugsw;
@@ -47,8 +41,6 @@ extern int listsw;
 extern int rfc934sw;
 extern int contentidsw;
 
-extern int endian;     /* mhmisc.c */
-
 /* cache policies */
 extern int rcachesw;   /* mhcachesbr.c */
 extern int wcachesw;   /* mhcachesbr.c */
@@ -65,15 +57,11 @@ static char prefix[] = "----- =_aaaaaaaaaa";
 
 
 /* mhmisc.c */
-int make_intermediates (char *);
 void content_error (char *, CT, char *, ...);
 
 /* mhcachesbr.c */
 int find_cache (CT, int, int *, char *, char *, int);
 
-/* ftpsbr.c */
-int ftp_get (char *, char *, char *, char *, char *, char *, int, int);
-
 /* mhfree.c */
 void free_content (CT);
 void free_ctinfo (CT);
@@ -82,7 +70,7 @@ void free_encoding (CT, int);
 /*
  * prototypes
  */
-CT build_mime (char *);
+CT build_mime (char *, int);
 
 /*
  * static prototypes
@@ -97,6 +85,37 @@ static int build_headers (CT);
 static char *calculate_digest (CT, int);
 
 
+static unsigned char directives_stack[32];
+static unsigned int directives_index;
+
+static int do_direct(void)
+{
+    return directives_stack[directives_index];
+}
+
+static void directive_onoff(int onoff)
+{
+    if (directives_index >= sizeof(directives_stack) - 1) {
+       fprintf(stderr, "mhbuild: #on/off overflow, continuing\n");
+       return;
+    }
+    directives_stack[++directives_index] = onoff;
+}
+
+static void directive_init(int onoff)
+{
+    directives_index = 0;
+    directives_stack[0] = onoff;
+}
+
+static void directive_pop(void)
+{
+    if (directives_index > 0)
+       directives_index--;
+    else
+       fprintf(stderr, "mhbuild: #pop underflow, continuing\n");
+}
+
 /*
  * Main routine for translating composition file
  * into valid MIME message.  It translates the draft
@@ -107,7 +126,7 @@ static char *calculate_digest (CT, int);
  */
 
 CT
-build_mime (char *infile)
+build_mime (char *infile, int directives)
 {
     int        compnum, state;
     char buf[BUFSIZ], name[NAMESZ];
@@ -117,6 +136,8 @@ build_mime (char *infile)
     CT ct;
     FILE *in;
 
+    directive_init(directives);
+
     umask (~m_gmprot ());
 
     /* open the composition draft */
@@ -337,20 +358,34 @@ static char *
 fgetstr (char *s, int n, FILE *stream)
 {
     char *cp, *ep;
+    int o_n = n;
+
+    while(1) {
+       for (ep = (cp = s) + o_n; cp < ep; ) {
+           int i;
 
-    for (ep = (cp = s) + n; cp < ep; ) {
-       int i;
+           if (!fgets (cp, n, stream))
+               return (cp != s ? s : NULL);
 
-       if (!fgets (cp, n, stream))
-           return (cp != s ? s : NULL);
-       if (cp == s && *cp != '#')
-           return s;
+           if (cp == s && *cp != '#')
+               return s;
+
+           cp += (i = strlen (cp)) - 1;
+           if (i <= 1 || *cp-- != '\n' || *cp != '\\')
+               break;
+           *cp = '\0';
+           n -= (i - 2);
+       }
 
-       cp += (i = strlen (cp)) - 1;
-       if (i <= 1 || *cp-- != '\n' || *cp != '\\')
+       if (strcmp(s, "#on\n") == 0) {
+           directive_onoff(1);
+       } else if (strcmp(s, "#off\n") == 0) {
+           directive_onoff(0);
+       } else if (strcmp(s, "#pop\n") == 0) {
+           directive_pop();
+       } else {
            break;
-       *cp = '\0';
-       n -= (i - 2);
+       }
     }
 
     return s;
@@ -377,7 +412,7 @@ user_content (FILE *in, char *file, char *buf, CT *ctp)
     CT ct;
     CE ce;
 
-    if (buf[0] == '\n' || strcmp (buf, "#\n") == 0) {
+    if (buf[0] == '\n' || (do_direct() && strcmp (buf, "#\n") == 0)) {
        *ctp = NULL;
        return OK;
     }
@@ -402,7 +437,7 @@ user_content (FILE *in, char *file, char *buf, CT *ctp)
      * 2) begins with "##"             (implicit directive)
      * 3) begins with "#<"
      */
-    if (buf[0] != '#' || buf[1] == '#' || buf[1] == '<') {
+    if (!do_direct() || buf[0] != '#' || buf[1] == '#' || buf[1] == '<') {
        int headers;
        int inlineD;
        long pos;
@@ -417,7 +452,7 @@ user_content (FILE *in, char *file, char *buf, CT *ctp)
        ce->ce_file = add (cp, NULL);
        ce->ce_unlink = 1;
 
-       if (buf[0] == '#' && buf[1] == '<') {
+       if (do_direct() && (buf[0] == '#' && buf[1] == '<')) {
            strncpy (content, buf + 2, sizeof(content));
            inlineD = 1;
            goto rock_and_roll;
@@ -428,11 +463,11 @@ user_content (FILE *in, char *file, char *buf, CT *ctp)
        /* the directive is implicit */
        strncpy (content, "text/plain", sizeof(content));
        headers = 0;
-       strncpy (buffer, buf[0] != '#' ? buf : buf + 1, sizeof(buffer));
+       strncpy (buffer, (!do_direct() || buf[0] != '#') ? buf : buf + 1, sizeof(buffer));
        for (;;) {
            int i;
 
-           if (headers >= 0 && uprf (buffer, DESCR_FIELD)
+           if (headers >= 0 && do_direct() && uprf (buffer, DESCR_FIELD)
                && buffer[i = strlen (DESCR_FIELD)] == ':') {
                headers = 1;
 
@@ -455,7 +490,7 @@ again_descr:
                }
            }
 
-           if (headers >= 0 && uprf (buffer, DISPO_FIELD)
+           if (headers >= 0 && do_direct() && uprf (buffer, DISPO_FIELD)
                && buffer[i = strlen (DISPO_FIELD)] == ':') {
                headers = 1;
 
@@ -486,7 +521,7 @@ rock_and_roll:
            pos = ftell (in);
            if ((cp = fgetstr (buffer, sizeof(buffer) - 1, in)) == NULL)
                break;
-           if (buffer[0] == '#') {
+           if (do_direct() && buffer[0] == '#') {
                char *bp;
 
                if (buffer[1] != '#')
@@ -860,20 +895,19 @@ use_forw:
 static void
 set_id (CT ct, int top)
 {
-    char msgid[BUFSIZ];
+    char contentid[BUFSIZ];
     static int partno;
     static time_t clock = 0;
     static char *msgfmt;
 
     if (clock == 0) {
        time (&clock);
-       snprintf (msgid, sizeof(msgid), "<%d.%ld.%%d@%s>\n",
-               (int) getpid(), (long) clock, LocalName());
+       snprintf (contentid, sizeof(contentid), "%s\n", message_id (clock, 1));
        partno = 0;
-       msgfmt = getcpy(msgid);
+       msgfmt = getcpy(contentid);
     }
-    snprintf (msgid, sizeof(msgid), msgfmt, top ? 0 : ++partno);
-    ct->c_id = getcpy (msgid);
+    snprintf (contentid, sizeof(contentid), msgfmt, top ? 0 : ++partno);
+    ct->c_id = getcpy (contentid);
 }
 
 
@@ -1324,12 +1358,11 @@ scan_content (CT ct)
                continue;
 
            if (contains8bit) {
-               t->tx_charset = CHARSET_UNKNOWN;
                *ap = concat ("charset=", write_charset_8bit(), NULL);
            } else {
-               t->tx_charset = CHARSET_USASCII;
                *ap = add ("charset=us-ascii", NULL);
            }
+           t->tx_charset = CHARSET_SPECIFIED;
 
            cp = strchr(*ap++, '=');
            *ap = NULL;
@@ -1516,11 +1549,6 @@ skip_headers:
     switch (ct->c_encoding) {
     case CE_7BIT:
        /* Nothing to output */
-#if 0
-       np = add (ENCODING_FIELD, NULL);
-       vp = concat (" ", "7bit", "\n", NULL);
-       add_header (ct, np, vp);
-#endif
        break;
 
     case CE_8BIT:
@@ -1612,13 +1640,14 @@ calculate_digest (CT ct, int asciiP)
     unsigned char *dp;
     unsigned char digest[16];
     unsigned char outbuf[25];
-    FILE *in;
     MD5_CTX mdContext;
     CE ce = ct->c_cefile;
+    char *infilename = ce->ce_file ? ce->ce_file : ct->c_file;
+    FILE *in;
 
     /* open content */
-    if ((in = fopen (ce->ce_file, "r")) == NULL)
-       adios (ce->ce_file, "unable to open for reading");
+    if ((in = fopen (infilename, "r")) == NULL)
+       adios (infilename, "unable to open for reading");
 
     /* Initialize md5 context */
     MD5Init (&mdContext);