char* sitoa (char* a, int i)
{
int sign=0;
int temp=0;
char buf[16];
char* ptr;
ptr = buf;
/* zero then return */
if( i )
{
/* make string in reverse form */
if( i < 0 )
{
i = ~i + 1;
sign++;
}
while( i )
{
*ptr++ = (i % 10) + '0';
i = i / 10;
}
if(sign)
{
*ptr++ = '-';
}
*ptr = '\0';
/* copy reverse order */
for( i=0; i < (int)strlen(buf); i++ )
{
*a++ = buf[strlen(buf)-i-1];
}
}
else
{
*a++ = '0';
}
return a;
}
char* uitoa (char *a, unsigned int i)
{
int sign=0;
int temp=0;
char buf[16];
char* ptr;
ptr = buf;
/* zero then return */
if( i )
{
while( i )
{
*ptr++ = (i % 10) + '0';
i = i / 10;
}
*ptr = '\0';
/* copy reverse order */
for( i=0; i < (int)strlen(buf); i++ )
{
*a++ = buf[strlen(buf)-i-1];
}
}
else
{
*a++ = '0';
}
return a;
}
char* htoa( char *a, unsigned int x, int opt)
{
int i;
int sign=0;
int temp=0;
char buf[16];
char* ptr;
ptr = buf;
/* zero then return */
if( x )
{
/* make string in reverse form */
while( x )
{
*ptr++ = (x&0x0f)<10 ? (x&0x0f)+'0' : (x&0x0f)-10+opt; x>>= 4;
}
*ptr = '\0';
/* copy reverse order */
for( i=0; i < (int)strlen(buf); i++ )
{
*a++ = buf[strlen(buf)-i-1];
}
}
else
{
*a++ = '0';
}
return a;
}
char * ltoa (long val, char *buf, unsigned radix)
{
char *p; /* pointer to traverse string */
char *firstdig; /* pointer to first digit */
char temp; /* temp char */
unsigned digval; /* value of digit */
p = buf;
if (radix == 10 && val < 0) {
/* negative, so output '-' and negate */
*p++ = '-';
val = (unsigned long)(-(long)val);
}
firstdig = p; /* save pointer to first digit */
do {
digval = (unsigned) (val % radix);
val /= radix; /* get next digit */
/* convert to ascii and store */
if (digval > 9)
*p++ = (char) (digval - 10 + 'a'); /* a letter */
else
*p++ = (char) (digval + '0'); /* a digit */
} while (val > 0);
/* We now have the digit of the number in the buffer, but in reverse
order. Thus we reverse them now. */
*p-- = '\\0'; /* terminate string; p points to last digit */
do {
temp = *p;
*p = *firstdig;
*firstdig = temp; /* swap *p and *firstdig */
--p;
++firstdig; /* advance to next two digits */
} while (firstdig < p); /* repeat until halfway */
return buf;
}
char *ftoa(float f, int *status)
{
typedef union
{
long L;
float F;
} LF_t;
long mantissa, int_part, frac_part;
short exp2;
LF_t x;
char* p;
static char outbuf[15];
*status = 0;
if (f == 0.0)
{
outbuf[0] = '0';
outbuf[1] = '.';
outbuf[2] = '0';
outbuf[3] = 0;
return outbuf;
}
x.F = f;
exp2 = (unsigned char)(x.L >> 23) - 127;
mantissa = (x.L & 0xFFFFFF) | 0x800000;
frac_part = 0;
int_part = 0;
if (exp2 >= 31)
{
*status = _FTOA_TOO_LARGE;
return 0;
}
else if (exp2 < -23)
{
*status = _FTOA_TOO_SMALL;
return 0;
}
else if (exp2 >= 23)
{
int_part = mantissa << (exp2 - 23);
}
else if (exp2 >= 0)
{
int_part = mantissa >> (23 - exp2);
frac_part = (mantissa << (exp2 + 1)) & 0xFFFFFF;
}
else /* if (exp2 < 0) */
{
frac_part = (mantissa & 0xFFFFFF) >> -(exp2 + 1);
}
p = outbuf;
if (x.L < 0)
{
*p++ = '-';
}
if (int_part == 0)
{
*p++ = '0';
}
else
{
ltoa(p, int_part, 10);
while (*p)
p++;
}
*p++ = '.';
if (frac_part == 0)
*p++ = '0';
else
{
char m, max;
max = sizeof (outbuf) - (p - outbuf) - 1;
if (max > 7)
{
max = 7;
}
/* print BCD */
for (m = 0; m < max; m++)
{
/* frac_part *= 10; */
frac_part = (frac_part << 3) + (frac_part << 1);
*p++ = (frac_part >> 24) + '0';
frac_part &= 0xFFFFFF;
}
/* delete ending zeroes */
for (--p; p[0] == '0' && p[-1] != '.'; --p)
;
++p;
}
*p = 0;
return outbuf;
}