]> diplodocus.org Git - nmh/commitdiff
contains8bit(): Don't fetch a byte when start >= end.
authorRalph Corderoy <ralph@inputplus.co.uk>
Sun, 20 Aug 2017 10:38:04 +0000 (11:38 +0100)
committerRalph Corderoy <ralph@inputplus.co.uk>
Sun, 20 Aug 2017 10:38:04 +0000 (11:38 +0100)
The test for a NUL byte was before the test for start being before end.
Whilst here, hoist the test of end out of the per-byte loop, alter the
function to return bool, and merge the two, different, comments
explaining the function's behaviour.

h/utils.h
sbr/utils.c

index 297746deeafa673ddec7213b050b55672bae5784..19fbdcc6d253675e94f227cbb47c8f35306faa7f 100644 (file)
--- a/h/utils.h
+++ b/h/utils.h
@@ -80,18 +80,7 @@ void trim_suffix_c(char *s, int c);
 void to_lower(char *s);
 void to_upper(char *s);
 
-/*
- * See if a string contains 8 bit characters (use isascii() for the test).
- * Arguments include:
- *
- * start       - Pointer to start of string to test.
- * end         - End of string to test (test will stop before reaching
- *               this point).  If NULL, continue until reaching '\0'.
- *
- * This function always stops at '\0' regardless of the value of 'end'.
- * Returns 1 if the string contains an 8-bit character, 0 if it does not.
- */
-int contains8bit(const char *start, const char *end);
+bool contains8bit(const char *start, const char *end);
 
 /*
  * See if file has any 8-bit bytes.
index 205c859240ed690c1b1c09cdcf30977d220f1117..8194f134754719a55e038ab6a4db615d142e0009 100644 (file)
@@ -533,24 +533,30 @@ nmh_version_changed (int older) {
 }
 
 
-/*
- * Scan for any 8-bit characters.  Return 1 if they exist.
- *
- * Scan up until the given endpoint (but not the actual endpoint itself).
- * If the endpoint is NULL, scan until a '\0' is reached.
- */
-
-int
-contains8bit(const char *start, const char *end)
+/* contains8bit returns true if any byte from start onwards fails
+ * isascii(3), i.e. is outside [0, 0x7f].  If start is NULL it returns
+ * false.  Bytes are examined until a NUL byte, or, if end is not NULL,
+ * whilst start is before end. */
+bool contains8bit(const char *start, const char *end)
 {
-    if (! start)
-       return 0;
+    const char *p;
+    char c;
 
-    while (*start != '\0' && (!end || (start < end)))
-       if (! isascii((unsigned char) *start++))
-           return 1;
+    if (!start)
+        return false;
 
-    return 0;
+    p = start;
+    if (end) {
+        while (p < end && (c = (*p++)))
+            if (!isascii((unsigned char)c))
+                return true;
+    } else {
+        while ((c = (*p++)))
+            if (!isascii((unsigned char)c))
+                return true;
+    }
+
+    return false;
 }