From e4064a8d08f56dbeb603fc46ddc2aa0f03c0802a Mon Sep 17 00:00:00 2001 From: tecodev Date: Sun, 10 Dec 2006 17:07:41 +0000 Subject: [PATCH] * device/lib/pic16/libc/stdio/vfprintf.c, * device/lib/pic16/libc/stdio/printf_small.c, * device/lib/pic16/libc/stdio/printf_timy.c: pop int from stack for char arguments, as char varargs are cast to int by the caller, hopefully fixes #1604915 (other device libraries are still affected) git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@4511 4a8a32a2-be11-0410-ad9d-d568d2c75423 --- ChangeLog | 8 ++++++++ device/lib/pic16/libc/stdio/printf_small.c | 2 +- device/lib/pic16/libc/stdio/printf_tiny.c | 6 ++++-- device/lib/pic16/libc/stdio/vfprintf.c | 3 ++- 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index 5e544e41..1b84fafc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2006-12-10 Raphael Neider + + * device/lib/pic16/libc/stdio/vfprintf.c, + * device/lib/pic16/libc/stdio/printf_small.c, + * device/lib/pic16/libc/stdio/printf_timy.c: pop int from stack for + char arguments, as char varargs are cast to int by the caller, + hopefully fixes #1604915 (other device libraries are still affected) + 2006-12-10 Erik Petrich * src/mcs51/ralloc.c (packRegsForAssign), * src/hc08/ralloc.c (packRegsForAssign): fixed bug #1605880 diff --git a/device/lib/pic16/libc/stdio/printf_small.c b/device/lib/pic16/libc/stdio/printf_small.c index 38382cef..8584474d 100644 --- a/device/lib/pic16/libc/stdio/printf_small.c +++ b/device/lib/pic16/libc/stdio/printf_small.c @@ -111,7 +111,7 @@ void printf_small(char *fmt, ...) __reentrant } else { if(flong)val = va_arg(ap, long); else - if(fchar)val = va_arg(ap, char); + if(fchar)val = (char)va_arg(ap, int); // FIXME: SDCC casts char arguments into ints else { val = va_arg(ap, int); } diff --git a/device/lib/pic16/libc/stdio/printf_tiny.c b/device/lib/pic16/libc/stdio/printf_tiny.c index 906fc4c0..caa3152c 100644 --- a/device/lib/pic16/libc/stdio/printf_tiny.c +++ b/device/lib/pic16/libc/stdio/printf_tiny.c @@ -132,8 +132,10 @@ void printf_tiny(char *fmt, ...) } else { if(ISLONG)val = va_arg(ap, long); else - if(ISCHAR)val = va_arg(ap, char); - else { + if(ISCHAR) { + val = (unsigned char)va_arg(ap, int); // FIXME: SDCC casts char arguments into ints + if (!HAVESIGN) val = (char)val; // FIXME cont'd: sign-extend if required + } else { val = va_arg(ap, int); } diff --git a/device/lib/pic16/libc/stdio/vfprintf.c b/device/lib/pic16/libc/stdio/vfprintf.c index 706d9704..7a296920 100644 --- a/device/lib/pic16/libc/stdio/vfprintf.c +++ b/device/lib/pic16/libc/stdio/vfprintf.c @@ -138,7 +138,8 @@ unsigned int vfprintf(FILE *stream, char *fmt, va_list ap) #endif } else if(fchar) { - val = va_arg(ap, char); + val = (unsigned char)va_arg(ap, int); // FIXME: SDCC passes 1-byte char varargs as 2-byte ints... + if (!nosign) val = (char) val; // (FIXME cont'd) sign extend if required #if _DEBUG io_long(val); #endif -- 2.30.2