]> diplodocus.org Git - nmh/blobdiff - sbr/utils.c
mhbuildsbr.c: Flip logic, moving goto to then-block; no need for else.
[nmh] / sbr / utils.c
index ef5116e82d905fde6589919a670c6a1a9f5b348f..8194f134754719a55e038ab6a4db615d142e0009 100644 (file)
@@ -35,7 +35,7 @@ void *mh_xmalloc(size_t size)
         size = 1; /* Some mallocs don't like 0. */
     p = malloc(size);
     if (!p)
-        adios(NULL, "malloc failed, size wanted: %zu", size);
+        adios(NULL, "malloc failed, size wanted: %lu", (unsigned long)size);
 
     return p;
 }
@@ -55,7 +55,7 @@ void *mh_xrealloc(void *ptr, size_t size)
 
     new = realloc(ptr, size);
     if (!new)
-        adios(NULL, "realloc failed, size wanted: %zu", size);
+        adios(NULL, "realloc failed, size wanted: %lu", (unsigned long)size);
 
     return new;
 }
@@ -70,7 +70,8 @@ void *mh_xcalloc(size_t nelem, size_t elsize)
 
     p = calloc(nelem, elsize);
     if (!p)
-        adios(NULL, "calloc failed, size wanted: %zu * %zu", nelem, elsize);
+        adios(NULL, "calloc failed, size wanted: %lu * %lu",
+            (unsigned long)nelem, (unsigned long)elsize);
 
     return p;
 }
@@ -532,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;
 }
 
 
@@ -588,28 +595,17 @@ m_str(int value) {
  * Convert an int to a char string, of limited width if > 0.
  */
 #define STR(s) #s
-#define SIZE(n) (sizeof STR(n)) /* Includes NUL. */
+/* SIZE(n) includes NUL.  n must just be digits, not an equation. */
+#define SIZE(n) (sizeof STR(n))
 
 char *
 m_strn(int value, unsigned int width) {
-    /* +1 to allow negative sign. */
-    static char buffer[SIZE(INT_MAX) + 1];
-
-    if (width == 0) {
-        snprintf(buffer, sizeof buffer, "%d", value);
-    } else {
-        int max_val = 1;
-        unsigned int i;
-        for (i = 0; i < (value >= 0 ? width : width-1); ++i) {
-            max_val *= 10;
-        }
-
-        if (abs(value) <= max_val  &&  width > 0) {
-            snprintf(buffer, sizeof buffer, "%d", value);
-        } else {
-            snprintf(buffer, sizeof buffer, "%c", '?');
-        }
-    }
-
-    return buffer;
+    /* Need to include space for negative sign.  But don't use INT_MIN
+       because it could be a macro that would fool SIZE(n). */
+    static char buffer[SIZE(-INT_MAX)];
+    const int num_chars = snprintf(buffer, sizeof buffer, "%d", value);
+
+    return num_chars > 0  &&  (width == 0 || (unsigned int) num_chars <= width)
+        ? buffer
+        : "?";
 }