Fix header name.
[bertos.git] / mware / formatwr.c
index 9e85ce862508553cee6f7982633c4bbe010295ef..8a2e57e1af027e61a51639bd8e1bca650dcbd548 100755 (executable)
 
 /*#*
  *#* $Log$
+ *#* Revision 1.17  2005/11/04 17:43:27  bernie
+ *#* Fix for LP64 architectures; Add some more tests.
+ *#*
+ *#* Revision 1.16  2005/07/19 07:25:46  bernie
+ *#* Use appconfig.h instead of cfg/config.h.
+ *#*
+ *#* Revision 1.15  2005/04/11 19:10:28  bernie
+ *#* Include top-level headers from cfg/ subdir.
+ *#*
+ *#* Revision 1.14  2005/03/01 23:26:22  bernie
+ *#* Use shared hextab.
+ *#*
  *#* Revision 1.13  2005/02/18 12:33:25  bernie
  *#* Avoid strlen().
  *#*
  *#*/
 
 #include "formatwr.h"
-#include "pgm.h"
-//#include <compiler.h> /* progmem macros */
-#include <config.h> /* CONFIG_ macros */
-#include <debug.h> /* ASSERT */
+#include <mware/pgm.h>
+#include <mware/hex.h>
+#include <cfg/debug.h> /* ASSERT */
+#include <appconfig.h> /* CONFIG_ macros */
 
 #ifndef CONFIG_PRINTF_N_FORMATTER
        /*! Disable the arcane %n formatter. */
@@ -403,7 +415,7 @@ PGM_FUNC(_formatted_write)(const char * PGM_ATTR format,
                flags.progmem = false;
 #endif
                ptr = buf_pointer = &buf[0];
-               hex = "0123456789ABCDEF";
+               hex = HEX_tab;
 
                /* check for leading '-', '+', ' ','#' or '0' flags  */
                for (;;)
@@ -575,7 +587,7 @@ NEXT_FLAG:
                                        precision++;
 #endif
                        case 'x':
-                               hex = "0123456789abcdef";
+                               hex = hex_tab;
                        case 'u':
                        case 'p':
                        case 'X':
@@ -583,15 +595,15 @@ NEXT_FLAG:
 #if defined(__AVR__) || defined(__I196__) /* 16bit pointers */
                                        ulong = (unsigned long)(unsigned short)va_arg(ap, char *);
 #else /* 32bit pointers */
-                               ulong = (unsigned long)va_arg(ap, char *);
+                                       ulong = (unsigned long)va_arg(ap, char *);
 #endif /* 32bit pointers */
-                               else if (sizeof(short) == sizeof(int))
-                                       ulong = flags.l_L_modifier ?
-                                               va_arg(ap, unsigned long) : (unsigned long)va_arg(ap, unsigned int);
+                               else if (flags.l_L_modifier)
+                                       ulong = va_arg(ap, unsigned long);
+                               else if (flags.h_modifier)
+                                       ulong = (unsigned long)(unsigned short)va_arg(ap, unsigned int);
                                else
-                                       ulong = flags.h_modifier ?
-                                               (unsigned long)(unsigned short) va_arg(ap, int)
-                                               : (unsigned long)va_arg(ap, int);
+                                       ulong = va_arg(ap, unsigned int);
+
                                flags.div_factor =
 #if CONFIG_PRINTF_OCTAL_FORMATTER
                                        (format_flag == 'o') ? DIV_OCT :
@@ -602,32 +614,18 @@ NEXT_FLAG:
 
                        case 'd':
                        case 'i':
-                               if (sizeof(short) == sizeof(long))
-                               {
-                                       if ( (long)(ulong = va_arg(ap, unsigned long)) < 0)
-                                       {
-                                               flags.plus_space_flag = PSF_MINUS;
-                                               ulong = (unsigned long)(-((signed long)ulong));
-                                       }
-                               }
-                               else if (sizeof(short) == sizeof(int))
-                               {
-                                       if ( (long)(ulong = flags.l_L_modifier ?
-                                                               va_arg(ap,unsigned long) : (unsigned long)va_arg(ap,int)) < 0)
-                                       {
-                                               flags.plus_space_flag = PSF_MINUS;
-                                               ulong = (unsigned long)(-((signed long)ulong));
-                                       }
-                               }
+                               if (flags.l_L_modifier)
+                                       ulong = (unsigned long)(long)va_arg(ap, long);
                                else
+                                       ulong = (unsigned long)(long)va_arg(ap, int);
+
+                               /* Extract sign */
+                               if ((signed long)ulong < 0)
                                {
-                                       if ( (signed long)(ulong = (unsigned long) (flags.h_modifier ?
-                                                                       (short) va_arg(ap, int) : va_arg(ap,int))) < 0)
-                                       {
-                                               flags.plus_space_flag = PSF_MINUS;
-                                               ulong = (unsigned long)(-((signed long)ulong));
-                                       }
+                                       flags.plus_space_flag = PSF_MINUS;
+                                       ulong = (unsigned long)(-((signed long)ulong));
                                }
+
                                flags.div_factor = DIV_DEC;
 
                                /* Now convert to digits */