Move mware/prog_avr module to drv/flash_avr; add kfile Ctor; merge flash read/write...
[bertos.git] / mware / formatwr.c
index 54d0640847d7da4a07fa9e4c5cb60ee452888198..f8df352ee8523394bffa2cdf87b9a55069b7f42f 100755 (executable)
@@ -1,4 +1,4 @@
-/*!
+/**
  * \file
  * <!--
  * Copyright 2003, 2004, 2005 Develer S.r.l. (http://www.develer.com/)
 
 /*#*
  *#* $Log$
+ *#* Revision 1.19  2006/09/20 13:58:17  marco
+ *#* Added z modifier in string format.
+ *#*
+ *#* Revision 1.18  2006/07/19 12:56:27  bernie
+ *#* Convert to new Doxygen style.
+ *#*
+ *#* 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.
  *#*
 #include "formatwr.h"
 #include <mware/pgm.h>
 #include <mware/hex.h>
-#include <config.h> /* CONFIG_ macros */
-#include <debug.h> /* ASSERT */
+#include <cfg/debug.h> /* ASSERT */
+#include <appconfig.h> /* CONFIG_ macros */
 
 #ifndef CONFIG_PRINTF_N_FORMATTER
-       /*! Disable the arcane %n formatter. */
+       /** Disable the arcane %n formatter. */
        #define CONFIG_PRINTF_N_FORMATTER 0
 #endif
 
 #ifndef CONFIG_PRINTF_OCTAL_FORMATTER
-       /*! Disable the %o formatter. */
+       /** Disable the %o formatter. */
        #define CONFIG_PRINTF_OCTAL_FORMATTER 0
 #endif
 
@@ -311,7 +326,7 @@ CLEAN_UP:
 
 #endif /* CONFIG_PRINTF > PRINTF_NOFLOAT */
 
-/*!
+/**
  * This routine forms the core and entry of the formatter.
  *
  * The conversion performed conforms to the ANSI specification for "printf".
@@ -486,11 +501,12 @@ NEXT_FLAG:
                flags.l_L_modifier = false;
                flags.h_modifier = false;
 
-               /* Optional 'l','L' r 'h' modifier? */
+               /* Optional 'l','L','z' or 'h' modifier? */
                switch (PGM_READ_CHAR(format))
                {
                        case 'l':
                        case 'L':
+                       case 'z':
                                flags.l_L_modifier = true;
                                format++;
                                break;
@@ -586,15 +602,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 :
@@ -605,32 +621,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 */
@@ -822,7 +824,7 @@ FLOATING_CONVERSION:
 #else /* PRINTF_REDUCED starts here */
 
 #if CONFIG_PRINTF > PRINTF_NOMODIFIERS
-       char l_modifier, h_modifier;
+       bool l_modifier, h_modifier;
        unsigned long u_val, div_val;
 #else
        unsigned int u_val, div_val;
@@ -848,16 +850,16 @@ FLOATING_CONVERSION:
                /*=================================*/
                /* Optional 'l' or 'h' modifiers ? */
                /*=================================*/
-               l_modifier = h_modifier = 0;
+               l_modifier = h_modifier = false;
                switch (PGM_READ_CHAR(format))
                {
                        case 'l':
-                               l_modifier = 1;
+                               l_modifier = true;
                                format++;
                                break;
 
                        case 'h':
-                               h_modifier = 1;
+                               h_modifier = true;
                                format++;
                                break;
                }