[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [rtl] printing float
- To: rtl@rtlinux.org
- Subject: Re: [rtl] printing float
- From: Tony Denault <denault@hawaii.edu>
- Date: Fri, 04 May 2001 18:08:54 -1000 (HST)
- In-reply-to: <3AE81F24.B199DBAE@radar.mcgill.ca>
On Thu, 26 Apr 2001, Frederic Cazenave wrote:
> Hi,
>
> What can I do to print float inside a fp thread ???
> I tryed to do
> char f_print[128];
>
After my signature, I'll post a very simple sprintf-like function - Its
very limited, but does floating point values. One of its problems
is that it uses the va_start() family of function. I think these are
non-reentrance macros so you can not do something like this:
int mrt_msg( const char * fmt, ...)
{
int l;
char buf[256];
va_list argptr;
va_start( argptr, fmt );
l = mrt_sprintf( buf, sizeof(buf), argptr );
va_end( argptr );
rtf_put( AO_FIFO_OUT_INX, buf, l);
return l;
}
I ended up having to duplicate the code for mrt_sprint() inside mrt_msg().
Anyone else have a better solution they are willing to post?
Tony
/-----------------------------------------------------------------------------\
| Tony Denault | Internet: denault@irtf.ifa.hawaii.edu |
| NASA IRTF, Institute of Astronomy | Phone: (808) 974-4206 |
| 1175 Manono St., Bldg 393 | Fax: (808) 974-4207 |
| Hilo, Hawaii 96720 | |
\-----------------------------------------------------------------------------/
There is my mrt_sprint():
#include <rtl_fifo.h>
#include <stdarg.h>
#include <string.h>
static char dig[10] = {'0','1','2','3','4','5','6','7','8','9' };
/*--------------------------------------------------------------------
** mrt_sprintf() - very simple sprintf funciton to format output.
** returns strlen(message).
*/
int mrt_sprintf( char * message, int msg_len, const char *format,...)
{
char buf[128];
int pos = 0;
va_list args;
va_start(args,format);
while (*format && (pos < msg_len-2)) {
if (*format == '%'){
char *b;
++format;
switch(*format) {
case 's':{
char *s;
s = va_arg(args,char *);
sprintf(buf,"%s",s);
}break;
case 'd':{
int d;
d = va_arg(args,int);
sprintf(buf,"%d",d);
}break;
case 'x':{
int d;
d = va_arg(args,int);
sprintf(buf,"%x",d);
}break;
case 'g':{
double f;
int fi, f0, f1, f2;
char c;
f = va_arg(args,double);
if (f <0){
c = '-';
f = -f;
}else{
c = ' ';
}
fi = (int)f; // integer portion.
// decmial portion...get index for upto 3 decmial places.
f = f - fi;
f0 = f*10; f0 %= 10;
f1 = f*100; f1 %= 10;
f2 = f*1000; f2 %= 10;
sprintf(buf,"%c%d.%c%c%c", c, fi, dig[f0], dig[f1], dig[f2]);
}break;
default:
sprintf(buf,"(Unsupported format %c)",*format);
}
++format;
b = buf;
while (*b && pos < msg_len-2){
message[pos] = *b;
++b;
++pos;
}
}else{
message[pos] = *format;
++pos;
++format;
}
}
message[pos] = 0;
va_end(args);
return pos;
}
/** done **/