]> diplodocus.org Git - nmh/blobdiff - uip/mhmisc.c
Alter HasSuffixC()'s char * to be const.
[nmh] / uip / mhmisc.c
index 75ac158373b0e50121dd8f67d1bb9166f18cee48..fddf284dd02914efbbd8f80f47a2ae74e14bc8b8 100644 (file)
@@ -2,15 +2,16 @@
 /*
  * mhparse.c -- misc routines to process MIME messages
  *
 /*
  * mhparse.c -- misc routines to process MIME messages
  *
- * $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.
  */
 
 #include <h/mh.h>
  */
 
 #include <h/mh.h>
-#include <errno.h>
 #include <h/mime.h>
 #include <h/mhparse.h>
 #include <h/mime.h>
 #include <h/mhparse.h>
+#include <h/utils.h>
 
 
-extern int errno;
 extern int debugsw;
 
 /*
 extern int debugsw;
 
 /*
@@ -21,7 +22,6 @@ int ntype = 0;
 char *parts[NPARTS + 1];
 char *types[NTYPES + 1];
 
 char *parts[NPARTS + 1];
 char *types[NTYPES + 1];
 
-int endian = 0;                /* little or big endian */
 int userrs = 0;
 
 static char *errs = NULL;
 int userrs = 0;
 
 static char *errs = NULL;
@@ -30,25 +30,55 @@ static char *errs = NULL;
 /*
  * prototypes
  */
 /*
  * prototypes
  */
-int part_ok (CT, int);
+int part_ok (CT);
+int part_exact(CT ct);
 int type_ok (CT, int);
 int type_ok (CT, int);
-void set_endian (void);
-int make_intermediates (char *);
 void content_error (char *, CT, char *, ...);
 void flush_errors (void);
 
 
 int
 void content_error (char *, CT, char *, ...);
 void flush_errors (void);
 
 
 int
-part_ok (CT ct, int sP)
+part_ok (CT ct)
 {
     char **ap;
 {
     char **ap;
+    int len;
 
 
-    if (npart == 0 || (ct->c_type == CT_MULTIPART && (sP || ct->c_subtype)))
+    /* a part is "ok", i.e., should be processed, if:
+       - there were no -part arguments
+       - this part is a multipart
+     */
+    if (npart == 0 || ct->c_type == CT_MULTIPART) {
        return 1;
        return 1;
+    }
 
 
-    for (ap = parts; *ap; ap++)
-       if (!strcmp (*ap, ct->c_partno))
-           return 1;
+    /* or if:
+       - this part is a an exact match for any -part option
+       - this part is a sub-part of any -part option
+     */
+    for (ap = parts; *ap; ap++) {
+        len = strlen(*ap);
+        if (!strncmp (*ap, ct->c_partno, len) &&
+                (!ct->c_partno[len] || ct->c_partno[len] == '.' )) {
+            return 1;
+       }
+    }
+
+    return 0;
+}
+
+int
+part_exact(CT ct)
+{
+    char **ap;
+
+    if (!ct->c_partno)
+       return 0;
+
+    for (ap = parts; *ap; ap++) {
+        if (!strcmp (*ap, ct->c_partno)) {
+            return 1;
+       }
+    }
 
     return 0;
 }
 
     return 0;
 }
@@ -73,28 +103,34 @@ type_ok (CT ct, int sP)
 }
 
 
 }
 
 
-void
-set_endian (void)
+/*
+ * Returns true if this content is marked as "inline".
+ *
+ * Technically we should check parent content to see if they have
+ * disposition to use as a default, but we don't right now.  Maybe
+ * later ....
+ */
+
+int
+is_inline(CT ct)
 {
 {
-    union {
-       long l;
-       char c[sizeof(long)];
-    } un;
-
-    un.l = 1;
-    endian = un.c[0] ? -1 : 1;
-    if (debugsw)
-       fprintf (stderr, "%s endian architecture\n",
-               endian > 0 ? "big" : "little");
-}
+    /*
+     * If there isn't any disposition at all, it's "inline".  Obviously
+     * if it's "inline", then it's inline.  RFC 2183 says if it's an unknown
+     * disposition, treat it as 'attachment'.
+     */
 
 
+    if (! ct->c_dispo_type || strcasecmp(ct->c_dispo_type, "inline") == 0)
+       return 1;
+    return 0;
+}
 
 int
 make_intermediates (char *file)
 {
     char *cp;
 
 
 int
 make_intermediates (char *file)
 {
     char *cp;
 
-    for (cp = file + 1; cp = strchr(cp, '/'); cp++) {
+    for (cp = file + 1; (cp = strchr(cp, '/')); cp++) {
        struct stat st;
 
        *cp = '\0';
        struct stat st;
 
        *cp = '\0';
@@ -109,7 +145,7 @@ losing_directory:
            }
 
            ep = concat ("Create directory \"", file, "\"? ", NULL);
            }
 
            ep = concat ("Create directory \"", file, "\"? ", NULL);
-           answer = getanswer (ep);
+           answer = read_yes_or_no_if_tty (ep);
            free (ep);
 
            if (!answer)
            free (ep);
 
            if (!answer)