case INT:
value = va_arg (args, int);
break;
+ case INTMAX:
+ value = va_arg (args, intmax_t);
+ break;
case LONG:
value = va_arg (args, long);
break;
case INT:
value = va_arg (args, unsigned);
break;
+ case INTMAX:
+ value = va_arg (args, uintmax_t);
+ break;
case LONG:
value = va_arg (args, unsigned long);
break;
const char *signifier; /* b->signifier or "". */
int precision; /* Rendered precision. */
int pad_cnt; /* # of pad characters to fill field width. */
- int group_cnt; /* # of digits grouped so far. */
+ int digit_cnt; /* # of digits output so far. */
/* Accumulate digits into buffer.
This algorithm produces digits in reverse order, so later we
will output the buffer's content in reverse. This is also
the reason that later we append zeros and the sign. */
cp = buf;
- group_cnt = 0;
+ digit_cnt = 0;
while (value > 0)
{
- if ((c->flags & GROUP) && group_cnt++ == b->group)
- {
- *cp++ = ',';
- group_cnt = 0;
- }
+ if ((c->flags & GROUP) && digit_cnt > 0 && digit_cnt % b->group == 0)
+ *cp++ = ',';
*cp++ = b->digits[value % b->base];
value /= b->base;
+ digit_cnt++;
}
/* Append enough zeros to match precision.
If requested precision is 0, then a value of zero is
rendered as a null string, otherwise as "0". */
precision = c->precision < 0 ? 1 : c->precision;
- if (precision < 0)
- precision = 1;
while (cp - buf < precision && cp - buf < (int) sizeof buf - 8)
*cp++ = '0';
}
\f
/* Dumps the SIZE bytes in BUF to the console as hex bytes
- arranged 16 per line, plus offsets listed starting at OFS for
- the first byte in BU. If ASCII is true then the corresponding
- ASCII characters are also rendered alongside. */
+ arranged 16 per line. Numeric offsets are also included,
+ starting at OFS for the first byte in BUF. If ASCII is true
+ then the corresponding ASCII characters are also rendered
+ alongside. */
void
hex_dump (uintptr_t ofs, const void *buf_, size_t size, bool ascii)
{