]> diplodocus.org Git - nmh/commitdiff
Simplified m_strn() per Ralph's suggestions.
authorDavid Levine <levinedl@acm.org>
Sat, 29 Jul 2017 16:42:35 +0000 (12:42 -0400)
committerDavid Levine <levinedl@acm.org>
Sat, 29 Jul 2017 16:42:35 +0000 (12:42 -0400)
Update to commit 4a56a28ac.

h/utils.h
sbr/utils.c

index 944a3cc..297746d 100644 (file)
--- a/h/utils.h
+++ b/h/utils.h
@@ -115,7 +115,7 @@ char *m_str(int value);
  * Returns string representation of an int, in static memory.  If width
  * == 0, does not limit the width.  If width > 0 and value will not fit
  * in field of that size, including any negative sign but excluding
  * Returns string representation of an int, in static memory.  If width
  * == 0, does not limit the width.  If width > 0 and value will not fit
  * in field of that size, including any negative sign but excluding
- * terminating null, then returns "?".  If width < 0, returns "?".
+ * terminating null, then returns "?".
  */
 char *m_strn(int value, unsigned int width);
 
  */
 char *m_strn(int value, unsigned int width);
 
index ef5116e..90f36bd 100644 (file)
@@ -588,28 +588,17 @@ m_str(int value) {
  * Convert an int to a char string, of limited width if > 0.
  */
 #define STR(s) #s
  * 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) {
 
 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
+        : "?";
 }
 }