{
char buf[CHAR_BIT * sizeof (off_t)];
char *p = buf + sizeof buf;
- int negative = offset < 0;
+
/* Don't negate offset here; it might overflow. */
- do {
- int remainder = offset % 10;
- int quotient = offset / 10;
- if (offset < 0 && 0 < remainder) {
- remainder -= 10;
- quotient++;
- }
- *--p = (remainder < 0 ? -remainder : remainder) + '0';
- width--;
- offset = quotient;
- } while (offset != 0);
- for (width -= negative; 0 < width; width--) {
- putc (' ', file);
+ if (offset < 0) {
+ do
+ *--p = '0' - offset % 10;
+ while ((offset /= 10) != 0);
+
+ *--p = '-';
+ } else {
+ do
+ *--p = '0' + offset % 10;
+ while ((offset /= 10) != 0);
}
- if (negative) {
- putc ('-', file);
+
+ width -= buf + sizeof buf - p;
+ while (0 < width--) {
+ putc (' ', file);
}
for (; p < buf + sizeof buf; p++)
putc (*p, file);