testboth("%d", -42, "-42")
testboth("%d", 42L, "42")
testboth("%d", -42L, "-42")
+testboth("%#x", 1, "0x1")
+testboth("%#x", 1L, "0x1")
+testboth("%#X", 1, "0X1")
+testboth("%#X", 1L, "0X1")
+testboth("%#o", 1, "01")
+testboth("%#o", 1L, "01")
+testboth("%#o", 0, "0")
+testboth("%#o", 0L, "0")
+testboth("%o", 0, "0")
+testboth("%o", 0L, "0")
+testboth("%d", 0, "0")
+testboth("%d", 0L, "0")
+testboth("%#x", 0, "0")
+testboth("%#x", 0L, "0")
+testboth("%#X", 0, "0")
+testboth("%#X", 0L, "0")
testboth("%x", 0x42, "42")
# testboth("%x", -0x42, "ffffffbe") # Alas, that's specific to 32-bit machines
numdigits = len - numnondigits;
assert(numdigits > 0);
- /* Get rid of base marker unless F_ALT */
- if ((flags & F_ALT) == 0) {
+ /* Get rid of base marker unless F_ALT. Even if F_ALT, leading 0x
+ * must be stripped if the *value* is 0.
+ */
+ if ((flags & F_ALT) == 0 ||
+ ((flags & F_ALT) &&
+ (type == 'x' || type == 'X') &&
+ numdigits == 1 &&
+ !sign &&
+ buf[2] == '0'
+ )) {
/* Need to skip 0x, 0X or 0. */
int skipped = 0;
switch (type) {
width--;
}
if ((flags & F_ALT) && (c == 'x' || c == 'X')) {
+ /* There's a base marker ("0x" or "0X") if and
+ * only if the value is non-zero.
+ */
assert(pbuf[0] == '0');
- assert(pbuf[1] == c);
- if (fill != ' ') {
- *res++ = *pbuf++;
- *res++ = *pbuf++;
+ if (pbuf[1] == c) {
+ if (fill != ' ') {
+ *res++ = *pbuf++;
+ *res++ = *pbuf++;
+ }
+ rescnt -= 2;
+ width -= 2;
+ if (width < 0)
+ width = 0;
+ len -= 2;
}
- rescnt -= 2;
- width -= 2;
- if (width < 0)
- width = 0;
- len -= 2;
}
if (width > len && !(flags & F_LJUST)) {
do {
if (sign)
*res++ = sign;
if ((flags & F_ALT) &&
- (c == 'x' || c == 'X')) {
- assert(pbuf[0] == '0');
- assert(pbuf[1] == c);
+ (c == 'x' || c == 'X') &&
+ pbuf[1] == c) {
*res++ = *pbuf++;
*res++ = *pbuf++;
}
}
if ((flags & F_ALT) && (c == 'x' || c == 'X')) {
assert(pbuf[0] == '0');
- assert(pbuf[1] == c);
- if (fill != ' ') {
- *res++ = *pbuf++;
- *res++ = *pbuf++;
+ if (pbuf[1] == c) {
+ if (fill != ' ') {
+ *res++ = *pbuf++;
+ *res++ = *pbuf++;
+ }
+ rescnt -= 2;
+ width -= 2;
+ if (width < 0)
+ width = 0;
+ len -= 2;
}
- rescnt -= 2;
- width -= 2;
- if (width < 0)
- width = 0;
- len -= 2;
}
if (width > len && !(flags & F_LJUST)) {
do {
if (fill == ' ') {
if (sign)
*res++ = sign;
- if ((flags & F_ALT) && (c == 'x' || c == 'X')) {
+ if ((flags & F_ALT) && (c == 'x' || c == 'X') &&
+ pbuf[1] == c) {
assert(pbuf[0] == '0');
- assert(pbuf[1] == c);
*res++ = *pbuf++;
*res++ = *pbuf++;
}