* src/pic16/device.c (Pics16[]): added devices 18F2550, 18F4331,
[fw/sdcc] / device / lib / pic16 / libc / stdio / printf_tiny.c
index d700b3f0a4c7a8d7b9bde03ba5d9844163ac88cc..2107a593d99ba656f23aa06ff96c2a61bd9262ef 100644 (file)
 
 /* following formats are supported :-
    format     output type       argument-type
+     %u*       unsigned            *
+
+     %b               binary
      %d        decimal             int
      %ld       decimal             long
      %hd       decimal             char
      %x        hexadecimal         int
-     %lx       hexadecimal         long
-     %hx       hexadecimal         char
+     %lxX      hexadecimal         long
+     %hxX      hexadecimal         char
      %o        octal               int
      %lo       octal               long
      %ho       octal               char
      %s        character           generic pointer
 */
 
+#include <ctype.h>
 #include <stdarg.h>
 #include <stdio.h>
 #include <stdlib.h>
 
+#if 0
+#define        DPUT(c) putchar( c )
+#else
+#define DPUT(c)
+#endif
+
+#define ISLONG         (flong)
+#define ISSTR          (fstr)
+#define ISCHAR         (fchar)
+#define HAVESIGN       (nosign)
+
+
+#if 1
+extern void io_long(long);
+extern void io_int(long);
+extern void io_char(char);
+#endif
+
 void printf_tiny(char *fmt, ...) 
 {
-  char *ch;
   char radix;
-  char flong;
-  char fstr;
-  char fchar;
-  char *str;
+  char flong, fstr;
+  char fchar, nosign;
+  char upcase;
+
+  char *str, *ch;
   data char *str1;
   long val;
-//  static
-  char buffer[35];
+//  static char buffer[16];
+  char buffer[16];
   va_list ap ;
 
-    ch = fmt;
     va_start(ap,fmt);
-
+    ch = fmt;
+    
     while( *ch ) {                     //for (; *fmt ; fmt++ )
         if (*ch == '%') {
-            flong = fstr = fchar = 0;
+            ISLONG = 0;
+            ISSTR = 0;
+            ISCHAR = 0;
+            HAVESIGN = 0;
             radix = 0;
+            upcase = 0;
             ch++;
 
+            if(*ch == 'u') {
+              HAVESIGN = 1;
+              ch++;
+            }
+            
             if(*ch == 'l') {
-              flong = 1;
+              ISLONG = 1;
               ch++;
             } else
             if(*ch == 'h') {
-              fchar = 1;
+              ISCHAR = 1;
               ch++;
             }
             
-            if(*ch == 's')fstr = 1;
+            if(*ch == 's')ISSTR = 1;
             else if(*ch == 'd')radix = 10;
-            else if(*ch == 'x')radix = 16;
+            else if(*ch == 'x'){ radix = 16; upcase = 0; }
+            else if(*ch == 'X'){ radix = 16; upcase = 1; }
             else if(*ch == 'c')radix = 0;
             else if(*ch == 'o')radix = 8;
+            else if(*ch == 'b')radix = 2;
             
-            if(fstr) {
+            if(ISSTR) {
                 str = va_arg(ap, char *);
-                while (*str) putchar(*str++);
+                while(*str) { putchar(*str);str++;}
             } else {
-              if(flong)val = va_arg(ap, long);
+              if(ISLONG)val = va_arg(ap, long);
               else
-              if(fchar)val = va_arg(ap, char);
+              if(ISCHAR)val = va_arg(ap, char);
               else {
                   val = va_arg(ap, int);
               }
-            
+
               if(radix) {
-                ltoa (val, buffer, radix);
+                if(HAVESIGN)
+                  ultoa(val, buffer, radix);
+                else
+                  ltoa (val, buffer, radix);
 
                 str1 = buffer;
-                while ( *str1 ) {
-                  putchar ( *str1++ );
+                while( (*str1) ) {
+                  radix = *str1;
+                  if(upcase)
+                    radix = toupper( radix );
+                  putchar ( radix );
+                  str1++;
                 }
               }        else
                 putchar((char)val);