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;
}
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;
}
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;
}
* 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
+ : "?";
}