* device/lib/pic16/libc/stdio/vfprintf.c,
authortecodev <tecodev@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Sun, 10 Dec 2006 17:07:41 +0000 (17:07 +0000)
committertecodev <tecodev@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Sun, 10 Dec 2006 17:07:41 +0000 (17:07 +0000)
* 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
device/lib/pic16/libc/stdio/printf_small.c
device/lib/pic16/libc/stdio/printf_tiny.c
device/lib/pic16/libc/stdio/vfprintf.c

index 5e544e4170ba640dfafb903275de15aaf564704d..1b84fafca99889c38a1b750db3cdfd0e2be1a210 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2006-12-10 Raphael Neider <rneider AT web.de>
+
+       * 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 <epetrich AT ivorytower.norman.ok.us>
        * src/mcs51/ralloc.c (packRegsForAssign),
        * src/hc08/ralloc.c (packRegsForAssign): fixed bug #1605880
index 38382cef7dc1ca70ccd6bc3fc57884d776f11745..8584474dd76ec31cbd3f79cf11513716c14703bf 100644 (file)
@@ -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);
               }
index 906fc4c048e174b03cb8d0b30e4c483efe519e53..caa3152c372da3ca971c0ac04180377a06398fbf 100644 (file)
@@ -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);
               }
 
index 706d9704001ad9d8bf18566f3ed366d414b0bf4c..7a296920ddee1e618b41937e53298c86d75c3f3e 100644 (file)
@@ -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