Doc fixes.
[bertos.git] / mware / formatwr.c
old mode 100755 (executable)
new mode 100644 (file)
index 54d0640..6353e1f
@@ -1,8 +1,33 @@
-/*!
+/**
  * \file
  * <!--
+ * This file is part of BeRTOS.
+ *
+ * Bertos is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * As a special exception, you may use this file as part of a free software
+ * library without restriction.  Specifically, if other files instantiate
+ * templates or use macros or inline functions from this file, or you compile
+ * this file and link it with other files to produce an executable, this
+ * file does not by itself cause the resulting executable to be covered by
+ * the GNU General Public License.  This exception does not however
+ * invalidate any other reasons why the executable file might be covered by
+ * the GNU General Public License.
+ *
  * Copyright 2003, 2004, 2005 Develer S.r.l. (http://www.develer.com/)
- * This file is part of DevLib - See README.devlib for information.
+ *
  * -->
  *
  * \version $Id$
  * width and precision arguments.
  */
 
-/*#*
- *#* $Log$
- *#* 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().
- *#*
- *#* Revision 1.12  2005/02/16 20:28:03  bernie
- *#* Add %S formatter.
- *#*
- *#* Revision 1.11  2005/02/16 16:51:29  bernie
- *#* Simplify float code.
- *#*
- *#* Revision 1.10  2004/10/26 09:01:35  bernie
- *#* Fix spacing.
- *#*
- *#* Revision 1.9  2004/09/14 21:06:23  bernie
- *#* Spelling fix.
- *#*
- *#* Revision 1.8  2004/08/25 14:12:09  rasky
- *#* Aggiornato il comment block dei log RCS
- *#*/
 
 #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 +313,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 +488,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 +589,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 +608,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 +811,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 +837,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;
                }