summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libc/stdio/printf.c31
1 files changed, 20 insertions, 11 deletions
diff --git a/libc/stdio/printf.c b/libc/stdio/printf.c
index 36c23c2fc..2940e44be 100644
--- a/libc/stdio/printf.c
+++ b/libc/stdio/printf.c
@@ -78,6 +78,11 @@
* 1) printf("%c",0) returned 0 instead of 1.
* 2) unrolled loop in asprintf to reduce size and remove compile warning.
*
+ *
+ * June 2001
+ * 1) fix %p so that "0x" is prepended to outputed hex val
+ * 2) fix %p so that "(nil)" is output for (void *)0 to match glibc
+ *
*/
/*****************************************************************************/
@@ -476,7 +481,7 @@ int vfnprintf(FILE * op, size_t max_size, const char *fmt, va_list ap)
if (*p == 'p') {
lval = (sizeof(char *) == sizeof(long));
upcase = 0;
- flag[FLAG_HASH] = 1;
+ flag[FLAG_HASH] = 'p';
}
#if defined(__UCLIBC_HAS_LONG_LONG__) || WANT_LONG_LONG_ERROR
if (lval >= 2) {
@@ -507,19 +512,23 @@ int vfnprintf(FILE * op, size_t max_size, const char *fmt, va_list ap)
}
#endif /* defined(__UCLIBC_HAS_LONG_LONG__) || WANT_LONG_LONG_ERROR */
flag[FLAG_PLUS] = '\0'; /* meaningless for unsigned */
- if (flag[FLAG_HASH] && (*p != '0')) { /* non-zero */
- if (radix == 8) {
- *--p = '0'; /* add leadding zero */
- } else if (radix != 10) { /* either 2 or 16 */
- flag[FLAG_PLUS] = '0';
- *--p = 'b';
- if (radix == 16) {
- *p = 'x';
- if (*fmt == 'X') {
- *p = 'X';
+ if (*p != '0') { /* non-zero */
+ if (flag[FLAG_HASH]) {
+ if (radix == 8) {
+ *--p = '0'; /* add leadding zero */
+ } else if (radix != 10) { /* either 2 or 16 */
+ flag[FLAG_PLUS] = '0';
+ *--p = 'b';
+ if (radix == 16) {
+ *p = 'x';
+ if (*fmt == 'X') {
+ *p = 'X';
+ }
}
}
}
+ } else if (flag[FLAG_HASH] == 'p') { /* null pointer */
+ p = "(nil)";
}
} else if (p-u_spec < 10) { /* signed conversion */
#if defined(__UCLIBC_HAS_LONG_LONG__) || WANT_LONG_LONG_ERROR