]> diplodocus.org Git - nmh/blobdiff - sbr/utils.c
dtimezone(): Explain abs(3) is undefined on INT_MIN.
[nmh] / sbr / utils.c
index 8281b4fc44fc172fb0de52de84858966f6077441..ef5116e82d905fde6589919a670c6a1a9f5b348f 100644 (file)
@@ -11,6 +11,7 @@
 #include "m_mktemp.h"
 #include "makedir.h"
 #include <fcntl.h>
+#include <limits.h>
 
 extern char *mhdocdir;
 
@@ -572,3 +573,43 @@ scan_input (int fd, int *eightbit) {
 
     return state == NOTOK  ?  NOTOK  :  OK;
 }
+
+
+/*
+ * Convert an int to a char string.
+ */
+char *
+m_str(int value) {
+    return m_strn(value, 0);
+}
+
+
+/*
+ * Convert an int to a char string, of limited width if > 0.
+ */
+#define STR(s) #s
+#define SIZE(n) (sizeof STR(n)) /* Includes NUL. */
+
+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;
+}