On Wed, 14 Nov 2001, Calin A. Culianu wrote:

> Umm, just like printk, rtl_printf doesn't support floats.  Rationale:
> floats don't (normally) belong in the kernel.  However, as we all know,
> for scientific or other applications using rt-linux, that design choice
> doesn't help us much... :( I myself have half a mind to patch rtl_printf
> myself so that I can printf some floats.  It shouldn't be too tough.. :/

I'm sure almost all rtlinux users must hack up their own version of
sprintf if they need floats in the RT code. I have a pretty ugly one that
works for me (float only carried out to 3 decmial places). Handy for quick
debugging. For real data display I used shared memory and have linux task
do the data display. I'm post it if anyone wishes to use it. I'm sure
there are much better version out there...how about posting them?

Maybe FMS can put a good implementation in their floating point
examples so everyone benefits.

Tony


/-----------------------------------------------------------------------------\
| Tony Denault                        | Internet: [EMAIL PROTECTED] |
| NASA IRTF, Institute of Astronomy   |                 Phone: (808) 974-4206 |
| 1175 Manono St., Bldg 393           |                   Fax: (808) 974-4207 |
| Hilo, Hawaii 96720                  |                                       |
\-----------------------------------------------------------------------------/


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;
}



-- [rtl] ---
To unsubscribe:
echo "unsubscribe rtl" | mail [EMAIL PROTECTED] OR
echo "unsubscribe rtl <Your_email>" | mail [EMAIL PROTECTED]
--
For more information on Real-Time Linux see:
http://www.rtlinux.org/

Reply via email to