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