Make %p and %# work properly, at least with pointers and floats.

This commit is contained in:
Richard Levitte 2003-04-03 23:35:14 +00:00
parent 68b42986cb
commit c433d72593

View File

@ -378,7 +378,7 @@ _dopr(
case 'p': case 'p':
value = (long)va_arg(args, void *); value = (long)va_arg(args, void *);
fmtint(sbuffer, buffer, &currlen, maxlen, fmtint(sbuffer, buffer, &currlen, maxlen,
value, 16, min, max, flags); value, 16, min, max, flags|DP_F_NUM);
break; break;
case 'n': /* XXX */ case 'n': /* XXX */
if (cflags == DP_C_SHORT) { if (cflags == DP_C_SHORT) {
@ -482,8 +482,9 @@ fmtint(
int flags) int flags)
{ {
int signvalue = 0; int signvalue = 0;
char *prefix = "";
unsigned LLONG uvalue; unsigned LLONG uvalue;
char convert[DECIMAL_SIZE(value)+1]; char convert[DECIMAL_SIZE(value)+3];
int place = 0; int place = 0;
int spadlen = 0; int spadlen = 0;
int zpadlen = 0; int zpadlen = 0;
@ -501,6 +502,10 @@ fmtint(
else if (flags & DP_F_SPACE) else if (flags & DP_F_SPACE)
signvalue = ' '; signvalue = ' ';
} }
if (flags & DP_F_NUM) {
if (base == 8) prefix = "0";
if (base == 16) prefix = "0x";
}
if (flags & DP_F_UP) if (flags & DP_F_UP)
caps = 1; caps = 1;
do { do {
@ -514,7 +519,7 @@ fmtint(
convert[place] = 0; convert[place] = 0;
zpadlen = max - place; zpadlen = max - place;
spadlen = min - OSSL_MAX(max, place) - (signvalue ? 1 : 0); spadlen = min - OSSL_MAX(max, place) - (signvalue ? 1 : 0) - strlen(prefix);
if (zpadlen < 0) if (zpadlen < 0)
zpadlen = 0; zpadlen = 0;
if (spadlen < 0) if (spadlen < 0)
@ -536,6 +541,12 @@ fmtint(
if (signvalue) if (signvalue)
doapr_outch(sbuffer, buffer, currlen, maxlen, signvalue); doapr_outch(sbuffer, buffer, currlen, maxlen, signvalue);
/* prefix */
while (*prefix) {
doapr_outch(sbuffer, buffer, currlen, maxlen, *prefix);
prefix++;
}
/* zeros */ /* zeros */
if (zpadlen > 0) { if (zpadlen > 0) {
while (zpadlen > 0) { while (zpadlen > 0) {
@ -692,7 +703,7 @@ fmtfp(
* Decimal point. This should probably use locale to find the correct * Decimal point. This should probably use locale to find the correct
* char to print out. * char to print out.
*/ */
if (max > 0) { if (max > 0 || (flags & DP_F_NUM)) {
doapr_outch(sbuffer, buffer, currlen, maxlen, '.'); doapr_outch(sbuffer, buffer, currlen, maxlen, '.');
while (fplace > 0) while (fplace > 0)