static const char *parse_conversion (const char *format,
struct printf_conversion *,
va_list *);
-static void format_integer (uintmax_t value, bool negative,
+static void format_integer (uintmax_t value, bool is_signed, bool negative,
const struct integer_base *,
const struct printf_conversion *,
void (*output) (char, void *), void *aux);
}
format_integer (value < 0 ? -value : value,
- value < 0, &base_d, &c, output, aux);
+ true, value < 0, &base_d, &c, output, aux);
}
break;
case 'X': b = &base_X; break;
default: NOT_REACHED ();
}
-
- format_integer (value, false, b, &c, output, aux);
+
+ format_integer (value, false, false, b, &c, output, aux);
}
break;
void *p = va_arg (args, void *);
c.flags = POUND;
- format_integer ((uintptr_t) p, false, &base_x, &c, output, aux);
+ format_integer ((uintptr_t) p, false, false,
+ &base_x, &c, output, aux);
}
break;
/* Performs an integer conversion, writing output to OUTPUT with
auxiliary data AUX. The integer converted has absolute value
- VALUE. If NEGATIVE is true the value is negative, otherwise
- positive. The output will use the given DIGITS, with
- strlen(DIGITS) indicating the output base. Details of the
- conversion are in C. */
+ VALUE. If IS_SIGNED is true, does a signed conversion with
+ NEGATIVE indicating a negative value; otherwise does an
+ unsigned conversion and ignores IS_SIGNED. The output will
+ use the given DIGITS, with strlen(DIGITS) indicating the
+ output base. Details of the conversion are in C. */
static void
-format_integer (uintmax_t value, bool negative, const struct integer_base *b,
+format_integer (uintmax_t value, bool is_signed, bool negative,
+ const struct integer_base *b,
const struct printf_conversion *c,
void (*output) (char, void *), void *aux)
{
*cp++ = '0';
/* Append sign. */
- if (c->flags & PLUS)
- *cp++ = negative ? '-' : '+';
- else if (c->flags & SPACE)
- *cp++ = negative ? '-' : ' ';
- else if (negative)
- *cp++ = '-';
-
+ if (is_signed)
+ {
+ if (c->flags & PLUS)
+ *cp++ = negative ? '-' : '+';
+ else if (c->flags & SPACE)
+ *cp++ = negative ? '-' : ' ';
+ else if (negative)
+ *cp++ = '-';
+ }
+
/* Calculate number of pad characters to fill field width. */
signifier = c->flags & POUND ? b->signifier : "";
pad_cnt = c->width - (cp - buf) - strlen (signifier);