* device/lib/printf_large.c (_print_format): fixed bug 1073386,
authormaartenbrock <maartenbrock@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Fri, 26 Nov 2004 16:28:21 +0000 (16:28 +0000)
committermaartenbrock <maartenbrock@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Fri, 26 Nov 2004 16:28:21 +0000 (16:28 +0000)
  (calculate_digit): added optimization for octal and hex
* support/regression/tests/bug1057979.c: added test for bug 1073386

git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@3586 4a8a32a2-be11-0410-ad9d-d568d2c75423

ChangeLog
device/lib/printf_large.c
support/regression/tests/bug1057979.c

index a5e4fa2d3cb21460ea4fc0284ac45053b162bfab..c608614c4be1ef392552331945ebe2b65e1e7c1e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,7 +1,14 @@
+2004-11-18 Maarten Brock <sourceforge.brock AT dse.nl>
+
+       * device/lib/printf_large.c (_print_format): fixed bug 1073386,
+         (calculate_digit): added optimization for octal and hex
+       * support/regression/tests/bug1057979.c: added test for bug 1073386
+
 2004-11-25 Vangelis Rokas <vrokas AT otenet.gr>
-        * src/pic16/pcode.c: fixed bug which may produce error in non-GNU
-        compilers
+
+       * src/pic16/pcode.c: fixed bug which may produce error in non-GNU
+       compilers
+
 2004-11-25 Vangelis Rokas <vrokas AT otenet.gr>
 
        * src/pic16/device.h,
@@ -25,7 +32,7 @@
        Library is not automatically build yet. But one can build it by
        invoking 'make' inside the libc directory.
        * added ADC library under libio. Preliminary version yet.
-       
+
        * src/pic16/gen.h: added emitTOGC macro, to toggle Carry flag,
        * src/pic16/gen.c (aopForRemat): asmop size is filled by
        aopForRemat() now and not by pic16_aopOp(),
index cad0a0476f93a0b0d7e63b5d4a8a1680535ee3de..1aa50e1e65232ddd1f68cd4c1acde26d98b6a53b 100644 (file)
@@ -141,6 +141,18 @@ static const char memory_id[] = "IXCP-";
 #if defined ASM_ALLOWED
 static void calculate_digit( unsigned char radix )
 {
+  if (radix == 8)
+  {
+    value.byte[4] = value.ul & 0x07;
+    value.ul >>= 3;
+  }
+  else if (radix == 16)
+  {
+    value.byte[4] = value.ul & 0x0F;
+    value.ul >>= 4;
+  }
+  else
+  {
   unsigned char i;
 
   for( i = 32; i != 0; i-- )
@@ -170,9 +182,22 @@ _endasm;
     }
   }
 }
+}
 #elif defined SDCC_STACK_AUTO
 static void calculate_digit( value_t* value, unsigned char radix )
 {
+  if (radix == 8)
+  {
+    value->byte[4] = value->ul & 0x07;
+    value->ul >>= 3;
+  }
+  else if (radix == 16)
+  {
+    value->byte[4] = value->ul & 0x0F;
+    value->ul >>= 4;
+  }
+  else
+  {
   unsigned char i;
 
   for( i = 32; i != 0; i-- )
@@ -187,9 +212,22 @@ static void calculate_digit( value_t* value, unsigned char radix )
     }
   }
 }
+}
 #else
 static void calculate_digit( unsigned char radix )
 {
+  if (radix == 8)
+  {
+    value.byte[4] = value.ul & 0x07;
+    value.ul >>= 3;
+  }
+  else if (radix == 16)
+  {
+    value.byte[4] = value.ul & 0x0F;
+    value.ul >>= 4;
+  }
+  else
+  {
   unsigned char i;
 
   for( i = 32; i != 0; i-- )
@@ -204,6 +242,7 @@ static void calculate_digit( unsigned char radix )
     }
   }
 }
+}
 #endif
 
 #if USE_FLOATS
@@ -648,6 +687,10 @@ get_conversion_spec:
         if (char_argument)
         {
           value.l = va_arg(ap,char);
+          if (!signed_argument)
+          {
+               value.l &= 0xFF;
+          }
         }
         else if (long_argument)
         {
@@ -656,6 +699,10 @@ get_conversion_spec:
         else // must be int
         {
           value.l = va_arg(ap,int);
+          if (!signed_argument)
+          {
+            value.l &= 0xFFFF;
+          }
         }
 
         if ( signed_argument )
index 258774959680b93b540fc8b4e8b10b23578caf08..70d1e2c144c970827622d82247dafe3474ff0642 100644 (file)
@@ -23,5 +23,9 @@ test_sprintf(void)
   sprintf( s, "%ld", 2147483647L );
   ASSERT( 0 == strcmp( s, "2147483647" ) );
 
+  //and from bug 1073386
+  sprintf( s, "%04X", 0x8765u );
+  ASSERT( 0 == strcmp( s, "8765" ) );
+
   ASSERT( s[12]==0x12 );
 }