// ********************************************************

//  eprintf.c  -- EmbeddablePRINTF

//

//     An alternative to printf for embedded applications.

//

// ********************************************************

#include <stdarg.h>

//#include <stdio.h>

 

 

#ifndef BYTE

#define BYTE unsigned char

#define WORD unsigned short

#define DWORD unsigned long

#endif

 

static BYTE NumDig;

 

 

void outchar(char Out)

{

 //printf("%c",Out);

 TODO: Send the character "Out" to whatever target such

              as serial port, i2c, LCD, parallel, etc...

}

 

void PrintDwordBase(DWORD x,BYTE base,BYTE CountOnly)

{

 DWORD lo;

 DWORD hi;

 

 lo=x%base;

 hi=x/base;

 if (hi) PrintDwordBase(hi,base,CountOnly);

 

 if (CountOnly) NumDig++;

 else outchar("0123456789ABCDEF"[lo]);

}

 

 

void PrintDword(DWORD dw,BYTE base,BYTE precision)

{

 NumDig=0;

 if (precision!=0xFF)

  {

   PrintDwordBase(dw,base,1);

   while (NumDig<precision) {outchar('0');NumDig++;}

  }

 

 PrintDwordBase(dw,base,0);

}

 

 

// Alternative to "printf"

void eprintf(char* String,...)

{

 BYTE precision;

 va_list ap;

 char*   pStr;

 char    ch,ch2;

 WORD    k;

 DWORD dk;

 int     j=0;

 

 va_start(ap,String);

 while (String[j]!=0)

  {

 

   if (String[j]=='%')

    {

     precision=0xFF;

     j++;

     ch=String[j];

 

     if (ch=='0')

      {

       j++;

       precision=String[j];

       if (precision=='*')

        {

          precision=va_arg(ap,char);

        }

       else precision-='0';

       j++;

       ch=String[j];

     }

 

     switch(ch)

      {

       case 'C':

       case 'c':

         ch=va_arg(ap,char);

        outchar(ch);

         break;

 

       case 'D':

       case 'd':

         k=va_arg(ap,WORD);

        PrintDword((DWORD)k,10,precision);

         break;

 

       case 'x':

       case 'X':

         k=va_arg(ap,WORD);

        PrintDword((DWORD)k,16,precision);

         break;

 

       case 'l':

       case 'L':

        j++;

        ch2=String[j];

        switch(ch2)

         {

          case 'd':

          case 'D':

           dk=va_arg(ap,DWORD);

           PrintDword(dk,10,precision);

           break;

 

          case 'x':

          case 'X':

           dk=va_arg(ap,DWORD);

           PrintDword(dk,16,precision);

           break;

 

          default:

           outchar('%');

           outchar(ch);

           outchar(ch2);

           break;

 

         }

        break;

 

       case 's':

         pStr=va_arg(ap,char*);

        eprintf(pStr);

         break;

 

       case '%':

        outchar('%');

         break;

 

       default:

        outchar('%');

        outchar(String[j]);

     break;

      }

    }

   else

    {

     outchar(String[j]);

    }

   j++;

  }

}