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

Posted by 셈말짓기 :