Programming/C2009. 10. 15. 00:23
#define putchar(c) outbyte(c)   
static void printchar(char **str, int c)   
{   
 extern int putchar(int c);   
 if (str) {   
  **str = c;   
  ++(*str);   
 }   
 else (void)putchar(c);   
}   
#define PAD_RIGHT 1   
#define PAD_ZERO 2   
static int prints(char **out, const char *string, int width, int pad)   
{   
 register int pc = 0, padchar = ' ';   
 if (width > 0) {   
  register int len = 0;   
  register const char *ptr;   
  for (ptr = string; *ptr; ++ptr) ++len;   
  if (len >= width) width = 0;   
  else width -= len;   
  if (pad & PAD_ZERO) padchar = '0';   
 }   
 if (!(pad & PAD_RIGHT)) {   
  for ( ; width > 0; --width) {   
   printchar (out, padchar);   
   ++pc;   
  }   
 }   
 for ( ; *string ; ++string) {   
  printchar (out, *string);   
  ++pc;   
 }   
 for ( ; width > 0; --width) {   
  printchar (out, padchar);   
  ++pc;   
 }   
 return pc;   
}   
/* the following should be enough for 32 bit int */  
#define PRINT_BUF_LEN 12   
static int printi(char **out, int i, int b, int sg, int width, int pad, int letbase)   
{   
 char print_buf[PRINT_BUF_LEN];   
 register char *s;   
 register int t, neg = 0, pc = 0;   
 register unsigned int u = i;   
 if (i == 0) {   
  print_buf[0] = '0';   
  print_buf[1] = '\0';   
  return prints (out, print_buf, width, pad);   
 }   
 if (sg && b == 10 && i < 0) {   
  neg = 1;   
  u = -i;   
 }   
 s = print_buf + PRINT_BUF_LEN-1;   
 *s = '\0';   
 while (u) {   
  t = u % b;   
  if( t >= 10 )   
   t += letbase - '0' - 10;   
  *--s = t + '0';   
  u /= b;   
 }   
 if (neg) {   
  if( width && (pad & PAD_ZERO) ) {   
   printchar (out, '-');   
   ++pc;   
   --width;   
  }   
  else {   
   *--s = '-';   
  }   
 }   
 return pc + prints (out, s, width, pad);   
}   
static int print(char **out, int *varg)   
{   
 register int width, pad;   
 register int pc = 0;   
 register char *format = (char *)(*varg++);   
 char scr[2];   
 for (; *format != 0; ++format) {   
  if (*format == '%') {   
   ++format;   
   width = pad = 0;   
   if (*format == '\0') break;   
   if (*format == '%') goto out;   
   if (*format == '-') {   
    ++format;   
    pad = PAD_RIGHT;   
   }   
   while (*format == '0') {   
    ++format;   
    pad |= PAD_ZERO;   
   }   
   for ( ; *format >= '0' && *format <= '9'; ++format) {   
    width *= 10;   
    width += *format - '0';   
   }   
   if( *format == 's' ) {   
    register char *s = *((char **)varg++);   
    pc += prints (out, s?s:"(null)", width, pad);   
    continue;   
   }   
   if( *format == 'd' ) {   
    pc += printi (out, *varg++, 10, 1, width, pad, 'a');   
    continue;   
   }   
   if( *format == 'x' ) {   
    pc += printi (out, *varg++, 16, 0, width, pad, 'a');   
    continue;   
   }   
   if( *format == 'X' ) {   
    pc += printi (out, *varg++, 16, 0, width, pad, 'A');   
    continue;   
   }   
   if( *format == 'u' ) {   
    pc += printi (out, *varg++, 10, 0, width, pad, 'a');   
    continue;   
   }   
   if( *format == 'c' ) {   
    /* char are converted to int then pushed on the stack */  
    scr[0] = *varg++;   
    scr[1] = '\0';   
    pc += prints (out, scr, width, pad);   
    continue;   
   }   
  }   
  else {   
  out:   
   printchar (out, *format);   
   ++pc;   
  }   
 }   
 if (out) **out = '\0';   
 return pc;   
}   
/* assuming sizeof(void *) == sizeof(int) */  
int printf(const char *format, ...)   
{   
 register int *varg = (int *)(&format);   
 return print(0, varg);   
}   
int sprintf(char *out, const char *format, ...)   
{   
 register int *varg = (int *)(&format);   
 return print(&out, varg);   
}   
#ifdef TEST_PRINTF   
int main(void)   
{   
 char *ptr = "Hello world!";   
 char *np = 0;   
 int i = 5;   
 unsigned int bs = sizeof(int)*8;   
 int mi;   
 char buf[80];   
 mi = (1 << (bs-1)) + 1;   
 printf("%s\n", ptr);   
 printf("printf test\n");   
 printf("%s is null pointer\n", np);   
 printf("%d = 5\n", i);   
 printf("%d = - max int\n", mi);   
 printf("char %c = 'a'\n", 'a');   
 printf("hex %x = ff\n", 0xff);   
 printf("hex %02x = 00\n", 0);   
 printf("signed %d = unsigned %u = hex %x\n", -3, -3, -3);   
 printf("%d %s(s)%", 0, "message");   
 printf("\n");   
 printf("%d %s(s) with %%\n", 0, "message");   
 sprintf(buf, "justif: \"%-10s\"\n", "left"); printf("%s", buf);   
 sprintf(buf, "justif: \"%10s\"\n", "right"); printf("%s", buf);   
 sprintf(buf, " 3: %04d zero padded\n", 3); printf("%s", buf);   
 sprintf(buf, " 3: %-4d left justif.\n", 3); printf("%s", buf);   
 sprintf(buf, " 3: %4d right justif.\n", 3); printf("%s", buf);   
 sprintf(buf, "-3: %04d zero padded\n", -3); printf("%s", buf);   
 sprintf(buf, "-3: %-4d left justif.\n", -3); printf("%s", buf);   
 sprintf(buf, "-3: %4d right justif.\n", -3); printf("%s", buf);   
 return 0;   
}   

printf의 소스... 천천히 봐볼까나...
Posted by skensita
TAG printf

댓글을 달아 주세요

Programming/C2009. 10. 15. 00:05
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;
}

출처 : http://cpueblo.com/programming/cpp/contents/99.html
Posted by skensita
TAG itoa

댓글을 달아 주세요

자동차2009. 10. 14. 00:39


오픈카라 해봐야... ㅋㅋ

사실 참 좋다...

오픈에어링을 즐기며 달리는 기분이란~

하지만 단점도 존재!!

여름 햇빛 쨍쨍할때 오픈하면 햇살이 참 뜨겁다... ㅠ_ㅠ

그때는 쫌 참아 주시고

또 문제가 요게 시속 10km 미만에서만 열고 닫기가 된다는것!

무엇이 문제인가.... 오픈을 하고 달리고 있다.... 터널이 보인다.... 나는 달리고 있다.... 못닫는다.... 열고 터널로 진입 -_-;;

오픈카 모는 사람들이 일부러 터널에서 열고 다니는게 아니랍니다 ㅠ_ㅠ

뭐 그래도 엄청난 매력을 가지는것 같다..^^

207CC라 그런지 조금 작다

조만간 307CC로 구입을 해야겠다...
Posted by skensita

댓글을 달아 주세요