]> diplodocus.org Git - nmh/blobdiff - sbr/m_convert.c
%(divide): Avoid SIGFPE on integer divide of INT_MIN by -1.
[nmh] / sbr / m_convert.c
index 3e9433b060ae52c92bfedc96fc518b978a26c21e..be12e5070389e64c3fd2bef9f9d5e116158fb6e3 100644 (file)
@@ -1,14 +1,18 @@
-
-/*
- * m_convert.c -- parse a message range or sequence and set SELECTED
+/* m_convert.c -- parse a message range or sequence and set SELECTED
  *
  * 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/utils.h>
+#include "h/mh.h"
+#include "ssequal.h"
+#include "m_convert.h"
+#include "folder_realloc.h"
+#include "context_find.h"
+#include "seq_getnum.h"
+#include "error.h"
+#include "h/utils.h"
 
 /*
  * error codes for sequence
@@ -39,7 +43,7 @@ static int attr (struct msgs *, char *);
 int
 m_convert (struct msgs *mp, char *name)
 {
-    int first, last, found, count, is_range, err;
+    int first, last, found, count, err;
     char *bp, *cp;
 
     /* check if user defined sequence */
@@ -56,7 +60,6 @@ m_convert (struct msgs *mp, char *name)
      */
 
     found = 0;
-    is_range = 1;
 
     /*
      * Check for special "new" sequence, which
@@ -131,9 +134,7 @@ rangerr:
 
     } else if (*cp == ':' || *cp == '=') {
 
-       if (*cp == '=')
-           is_range = 0;
-
+        bool is_range = *cp == ':';
        cp++;
 
        if (*cp == '-') {
@@ -204,8 +205,8 @@ single:
             * limits simply reallocate the folder so it's within range.
             */
            if (first < mp->lowoff || first > mp->hghoff)
-               mp = folder_realloc(mp, first < mp->lowoff ? first : mp->lowoff,
-                                   first > mp->hghoff ? first : mp->hghoff);
+                mp = folder_realloc(mp, min(first, mp->lowoff),
+                                    max(first, mp->hghoff));
 
            set_select_empty (mp, first);
        } else {
@@ -295,16 +296,16 @@ m_conv (struct msgs *mp, char *str, int call)
     delimp = cp;
 
     if (!strcmp (buf, "first"))
-       return (mp->hghmsg || !(mp->msgflags & ALLOW_NEW)
-               ? mp->lowmsg : BADMSG);
+       return mp->hghmsg || !(mp->msgflags & ALLOW_NEW) ?
+            mp->lowmsg : BADMSG;
 
     if (!strcmp (buf, "last")) {
        convdir = -1;
-       return (mp->hghmsg || !(mp->msgflags & ALLOW_NEW) ? mp->hghmsg : BADMSG);
+       return mp->hghmsg || !(mp->msgflags & ALLOW_NEW) ? mp->hghmsg : BADMSG;
     }
 
     if (!strcmp (buf, "cur") || !strcmp (buf, "."))
-       return (mp->curmsg > 0 ? mp->curmsg : BADMSG);
+       return mp->curmsg > 0 ? mp->curmsg : BADMSG;
 
     if (!strcmp (buf, "prev")) {
        convdir = -1;
@@ -351,9 +352,7 @@ attr (struct msgs *mp, char *cp)
     char op;
     int i, j;
     int found,
-       inverted = 0,
        count = 0,              /* range given?  else use entire sequence */
-       just_one = 0,           /* want entire sequence or range */
        first = 0,
        start = 0;
 
@@ -366,16 +365,19 @@ attr (struct msgs *mp, char *cp)
     }
 
     /* Check for sequence negation */
+    bool inverted = false;
     if ((dp = context_find (nsequence)) && *dp != '\0' && ssequal (dp, cp)) {
-       inverted = 1;
+       inverted = true;
        cp += strlen (dp);
     }
 
     convdir = 1;       /* convert direction */
 
-    for (dp = cp; *dp && isalnum((unsigned char) *dp); dp++)
+    for (dp = cp; isalnum((unsigned char)*dp); dp++)
        continue;
 
+    bool just_one = *dp == '='; /* want entire sequence or range */
+
     if (*dp == ':') {
        bp = dp++;
        count = 1;
@@ -456,8 +458,6 @@ attr (struct msgs *mp, char *cp)
        if (count == 0 || *ep)
            return BADLST;
 
-       just_one = 1;
-
        op = *bp;
        *bp = '\0';     /* temporarily terminate sequence name */
     }