// ********************************************************
// 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++;
}
}