]> diplodocus.org Git - nmh/blobdiff - uip/show.c
Use a dynamically-allocated buffer for character set conversion, and
[nmh] / uip / show.c
index 766aec947906f1a1dea3adeb7b5ba4add31dfe83..acd08afb1bc9cbe1e4ae7a1e5475b6a49ed2e25e 100644 (file)
@@ -55,25 +55,17 @@ main (int argc, char **argv)
     int draftsw = 0, headersw = 1;
     int nshow = 0, checkmime = 1, mime;
     int isdf = 0, mode = SHOW, msgnum;
     int draftsw = 0, headersw = 1;
     int nshow = 0, checkmime = 1, mime;
     int isdf = 0, mode = SHOW, msgnum;
-    char *cp, *maildir, *file = NULL, *folder = NULL, *proc;
+    char *cp, *maildir, *file = NULL, *folder = NULL, *proc, *program;
     char buf[BUFSIZ], **argp, **arguments;
     struct msgs *mp = NULL;
     struct msgs_array msgs = { 0, 0, NULL };
     struct msgs_array vec = { 0, 0, NULL };
 
     char buf[BUFSIZ], **argp, **arguments;
     struct msgs *mp = NULL;
     struct msgs_array msgs = { 0, 0, NULL };
     struct msgs_array vec = { 0, 0, NULL };
 
-#ifdef LOCALE
-    setlocale(LC_ALL, "");
-#endif
-    invo_name = r1bindex (argv[0], '/');
+    if (nmh_init(argv[0], 1)) { return 1; }
 
 
-    app_msgarg(&vec, NULL);  /* placeholder, filled later with proc name */
-
-    /* read user profile/context */
-    context_read();
-
-    if (!mh_strcasecmp (invo_name, "next")) {
+    if (!strcasecmp (invo_name, "next")) {
        mode = NEXT;
        mode = NEXT;
-    } else if (!mh_strcasecmp (invo_name, "prev")) {
+    } else if (!strcasecmp (invo_name, "prev")) {
        mode = PREV;
     }
     arguments = getarguments (invo_name, argc, argv, 1);
        mode = PREV;
     }
     arguments = getarguments (invo_name, argc, argv, 1);
@@ -193,14 +185,6 @@ usage:
        goto go_to_it;
     }
 
        goto go_to_it;
     }
 
-#ifdef WHATNOW
-    if (!msgs.size && !folder && mode == SHOW && (cp = getenv ("mhdraft")) && *cp) {
-       draftsw++;
-       app_msgarg(&vec, cp);
-       goto go_to_it;
-    }
-#endif /* WHATNOW */
-
     if (!msgs.size) {
        switch (mode) {
            case NEXT:
     if (!msgs.size) {
        switch (mode) {
            case NEXT:
@@ -223,7 +207,7 @@ usage:
        adios (maildir, "unable to change directory to");
 
     /* read folder and create message structure */
        adios (maildir, "unable to change directory to");
 
     /* read folder and create message structure */
-    if (!(mp = folder_read (folder)))
+    if (!(mp = folder_read (folder, 1)))
        adios (NULL, "unable to read folder %s", folder);
 
     /* check for empty folder */
        adios (NULL, "unable to read folder %s", folder);
 
     /* check for empty folder */
@@ -256,8 +240,8 @@ usage:
     context_replace (pfolder, folder); /* update current folder   */
     context_save ();                   /* save the context file   */
 
     context_replace (pfolder, folder); /* update current folder   */
     context_save ();                   /* save the context file   */
 
-    if (headersw && vec.size == 2)
-       printf ("(Message %s:%s)\n", folder, vec.msgs[1]);
+    if (headersw && vec.size == 1)
+       printf ("(Message %s:%s)\n", folder, vec.msgs[0]);
 
 go_to_it: ;
     fflush (stdout);
 
 go_to_it: ;
     fflush (stdout);
@@ -311,15 +295,15 @@ go_to_it: ;
        }
     } else if (strcmp (r1bindex (proc, '/'), "mhl") == 0) {
        /* If "mhl", then run it internally */
        }
     } else if (strcmp (r1bindex (proc, '/'), "mhl") == 0) {
        /* If "mhl", then run it internally */
-       vec.msgs[0] = "mhl";
+       argsplit_insert(&vec, "mhl", &program);
        app_msgarg(&vec, NULL);
        mhl (vec.size, vec.msgs);
        done (0);
     }
 
        app_msgarg(&vec, NULL);
        mhl (vec.size, vec.msgs);
        done (0);
     }
 
-    vec.msgs[0] = r1bindex (proc, '/');
+    argsplit_insert(&vec, proc, &program);
     app_msgarg(&vec, NULL);
     app_msgarg(&vec, NULL);
-    execvp (proc, vec.msgs);
+    execvp (program, vec.msgs);
     adios (proc, "unable to exec");
     return 0;  /* dead code to satisfy the compiler */
 }
     adios (proc, "unable to exec");
     return 0;  /* dead code to satisfy the compiler */
 }
@@ -332,8 +316,7 @@ static int
 is_nontext (char *msgnam)
 {
     int        result, state;
 is_nontext (char *msgnam)
 {
     int        result, state;
-    unsigned char *bp, *dp;
-    char *cp;
+    char *bp, *dp, *cp;
     char buf[BUFSIZ], name[NAMESZ];
     FILE *fp;
     m_getfld_state_t gstate = 0;
     char buf[BUFSIZ], name[NAMESZ];
     FILE *fp;
     m_getfld_state_t gstate = 0;
@@ -349,7 +332,7 @@ is_nontext (char *msgnam)
            /*
             * Check Content-Type field
             */
            /*
             * Check Content-Type field
             */
-           if (!mh_strcasecmp (name, TYPE_FIELD)) {
+           if (!strcasecmp (name, TYPE_FIELD)) {
                int passno;
                char c;
 
                int passno;
                char c;
 
@@ -363,7 +346,7 @@ is_nontext (char *msgnam)
                passno = 1;
 
 again:
                passno = 1;
 
 again:
-               for (; isspace (*bp); bp++)
+               for (; isspace ((unsigned char) *bp); bp++)
                    continue;
                if (*bp == '(') {
                    int i;
                    continue;
                if (*bp == '(') {
                    int i;
@@ -405,20 +388,20 @@ invalid:
                if (!*bp)
                    goto invalid;
                if (passno > 1) {
                if (!*bp)
                    goto invalid;
                if (passno > 1) {
-                   if ((result = (mh_strcasecmp (bp, "plain") != 0)))
+                   if ((result = (strcasecmp (bp, "plain") != 0)))
                        goto out;
                    *dp = c;
                        goto out;
                    *dp = c;
-                   for (dp++; isspace (*dp); dp++)
+                   for (dp++; isspace ((unsigned char) *dp); dp++)
                        continue;
                    if (*dp) {
                        if ((result = !uprf (dp, "charset")))
                            goto out;
                        dp += sizeof("charset") - 1;
                        continue;
                    if (*dp) {
                        if ((result = !uprf (dp, "charset")))
                            goto out;
                        dp += sizeof("charset") - 1;
-                       while (isspace (*dp))
+                       while (isspace ((unsigned char) *dp))
                            dp++;
                        if (*dp++ != '=')
                            goto invalid;
                            dp++;
                        if (*dp++ != '=')
                            goto invalid;
-                       while (isspace (*dp))
+                       while (isspace ((unsigned char) *dp))
                            dp++;
                        if (*dp == '"') {
                            if ((bp = strchr(++dp, '"')))
                            dp++;
                        if (*dp == '"') {
                            if ((bp = strchr(++dp, '"')))
@@ -437,7 +420,7 @@ invalid:
                    /* Check the character set */
                    result = !check_charset (dp, strlen (dp));
                } else {
                    /* Check the character set */
                    result = !check_charset (dp, strlen (dp));
                } else {
-                   if (!(result = (mh_strcasecmp (bp, "text") != 0))) {
+                   if (!(result = (strcasecmp (bp, "text") != 0))) {
                        *dp = c;
                        bp = dp;
                        passno = 2;
                        *dp = c;
                        bp = dp;
                        passno = 2;
@@ -448,6 +431,7 @@ out:
                free (cp);
                if (result) {
                    fclose (fp);
                free (cp);
                if (result) {
                    fclose (fp);
+                   m_getfld_state_destroy (&gstate);
                    return result;
                }
                break;
                    return result;
                }
                break;
@@ -456,25 +440,26 @@ out:
            /*
             * Check Content-Transfer-Encoding field
             */
            /*
             * Check Content-Transfer-Encoding field
             */
-           if (!mh_strcasecmp (name, ENCODING_FIELD)) {
+           if (!strcasecmp (name, ENCODING_FIELD)) {
                cp = add (buf, NULL);
                while (state == FLDPLUS) {
                    bufsz = sizeof buf;
                    state = m_getfld (&gstate, name, buf, &bufsz, fp);
                    cp = add (buf, cp);
                }
                cp = add (buf, NULL);
                while (state == FLDPLUS) {
                    bufsz = sizeof buf;
                    state = m_getfld (&gstate, name, buf, &bufsz, fp);
                    cp = add (buf, cp);
                }
-               for (bp = cp; isspace (*bp); bp++)
+               for (bp = cp; isspace ((unsigned char) *bp); bp++)
                    continue;
                    continue;
-               for (dp = bp; istoken (*dp); dp++)
+               for (dp = bp; istoken ((unsigned char) *dp); dp++)
                    continue;
                *dp = '\0';
                    continue;
                *dp = '\0';
-               result = (mh_strcasecmp (bp, "7bit")
-                      && mh_strcasecmp (bp, "8bit")
-                      && mh_strcasecmp (bp, "binary"));
+               result = (strcasecmp (bp, "7bit")
+                      && strcasecmp (bp, "8bit")
+                      && strcasecmp (bp, "binary"));
 
                free (cp);
                if (result) {
                    fclose (fp);
 
                free (cp);
                if (result) {
                    fclose (fp);
+                   m_getfld_state_destroy (&gstate);
                    return result;
                }
                break;
                    return result;
                }
                break;
@@ -496,8 +481,8 @@ out:
             */
        default:
            fclose (fp);
             */
        default:
            fclose (fp);
+           m_getfld_state_destroy (&gstate);
            return 0;
        }
     }
            return 0;
        }
     }
-    m_getfld_state_destroy (&gstate);
 }
 }