| @@ -31,9 +31,10 @@ | |||
| #include "avr_functions.h" | |||
| #include <string.h> | |||
| #include <stdlib.h> | |||
| #include <math.h> | |||
| char * ultoa(unsigned long val, char *buf, int radix) | |||
| char * ultoa(unsigned long val, char *buf, int radix) | |||
| { | |||
| unsigned digit; | |||
| int i=0, j; | |||
| @@ -66,7 +67,11 @@ char * ltoa(long val, char *buf, int radix) | |||
| } | |||
| } | |||
| #define DTOA_UPPER 0x04 | |||
| char * fcvtf(float, int, int *, int *); | |||
| int isnanf (float x); | |||
| int isinff (float x); | |||
| char * dtostrf(float val, int width, unsigned int precision, char *buf) | |||
| { | |||
| @@ -74,6 +79,52 @@ char * dtostrf(float val, int width, unsigned int precision, char *buf) | |||
| const char *s, *e; | |||
| char *p; | |||
| int awidth = abs(width); | |||
| if (isnanf(val)) { | |||
| int ndigs = (val<0) ? 4 : 3; | |||
| awidth = (awidth > ndigs) ? awidth - ndigs : 0; | |||
| if (width<0) { | |||
| while (awidth) { | |||
| *buf++ = ' '; | |||
| awidth--; | |||
| } | |||
| } | |||
| if (copysignf(1.0f, val)<0) *buf++ = '-'; | |||
| if (DTOA_UPPER) { | |||
| *buf++ = 'N'; *buf++ = 'A'; *buf++ = 'N'; | |||
| } else { | |||
| *buf++ = 'n'; *buf++ = 'a'; *buf++ = 'n'; | |||
| } | |||
| while (awidth) { | |||
| *buf++ = ' '; | |||
| awidth--; | |||
| } | |||
| *buf = 0; | |||
| return buf; | |||
| } | |||
| if (isinff(val)) { | |||
| int ndigs = (val<0) ? 4 : 3; | |||
| awidth = (awidth > ndigs) ? awidth - ndigs : 0; | |||
| if (width<0) { | |||
| while (awidth) { | |||
| *buf++ = ' '; | |||
| awidth--; | |||
| } | |||
| } | |||
| if (val<0) *buf++ = '-'; | |||
| if (DTOA_UPPER) { | |||
| *buf++ = 'I'; *buf++ = 'N'; *buf++ = 'F'; | |||
| } else { | |||
| *buf++ = 'i'; *buf++ = 'n'; *buf++ = 'f'; | |||
| } | |||
| while (awidth) { | |||
| *buf++ = ' '; | |||
| awidth--; | |||
| } | |||
| *buf = 0; | |||
| return buf; | |||
| } | |||
| s = fcvtf(val, precision, &decpt, &sign); | |||
| if (precision == 0 && decpt == 0) { | |||
| s = (*s < '5') ? "0" : "1"; | |||