* device/lib/_ltoa.c: 36 bytes less __data mem. This really helps printf_small. 32...
authorfrief <frief@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Fri, 27 Apr 2007 13:24:27 +0000 (13:24 +0000)
committerfrief <frief@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Fri, 27 Apr 2007 13:24:27 +0000 (13:24 +0000)
git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@4773 4a8a32a2-be11-0410-ad9d-d568d2c75423

ChangeLog
device/lib/_ltoa.c

index dee6a8f8e9fe5edcbf10e0adc4880154ab57997e..1cefc888d428b651c9d2a384d695b061e7aa8b0e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2007-03-27 Frieder Ferlemann <Frieder.Ferlemann AT web.de>
+
+       * device/lib/_ltoa.c: 36 bytes less __data mem. This really
+         helps printf_small. 32 bytes more __idata mem.
+
 2007-04-27 Raphael Neider <rneider AT web.de>
 
        * src/pic/pcode.c (addpCode2pBlock,LinkFlow,pBlockRemoveUnusedLabels):
index 0ee8be26875fa03921304c921cae74714d5da666..82dd693bfb26879f6699d11bc083c70cbbd27c3a 100755 (executable)
  radix  ->  Base of value (e.g.: 2 for binary, 10 for decimal, 16 for hex)
 ---------------------------------------------------------------------------*/
 
-#define NUMBER_OF_DIGITS 32
+/* "11110000111100001111000011110000" base 2 */
+/* "37777777777" base 8 */
+/* "4294967295" base 10 */
+#define NUMBER_OF_DIGITS 32    /* eventually adapt if base 2 not needed */
+
+#if NUMBER_OF_DIGITS < 32
+# warning _ltoa() and _ultoa() are not save for radix 2
+#endif
+
+#if defined (SDCC_mcs51) && defined (SDCC_MODEL_SMALL) && !defined (SDCC_STACK_AUTO)
+# define MEMSPACE_BUFFER __idata       /* eventually __pdata or __xdata */
+# pragma nogcse
+#else
+# define MEMSPACE_BUFFER 
+#endif
 
 void _ultoa(unsigned long value, char* string, unsigned char radix)
 {
-unsigned char index;
-char buffer[NUMBER_OF_DIGITS];  /* space for NUMBER_OF_DIGITS + '\0' */
-
-  index = NUMBER_OF_DIGITS;
+  char MEMSPACE_BUFFER buffer[NUMBER_OF_DIGITS];  /* no space for '\0' */
+  unsigned char index = NUMBER_OF_DIGITS;
 
   do {
-    buffer[--index] = '0' + (value % radix);
-    if ( buffer[index] > '9') buffer[index] += 'A' - '9' - 1;
+    unsigned char c = '0' + (value % radix);
+    if (c > '9') 
+       c += 'A' - '9' - 1;
+    buffer[--index] = c;
     value /= radix;
-  } while (value != 0);
+  } while (value);
 
   do {
-    *string++ = buffer[index++];
-  } while ( index < NUMBER_OF_DIGITS );
+    *string++ = buffer[index];
+  } while ( ++index != NUMBER_OF_DIGITS );
 
   *string = 0;  /* string terminator */
 }