C# 스타일의 format 출력

회사에서 Log관련 모듈을 만들어야 하는데
너무 괴로워서 다른 문서를 살펴보다가 va_list, va_arg 같은걸 보고, 일은 하기 싫고 코딩을 안하면 불안하고 해서 만들어 봤음… (생산성 0%…?)


GeSHi © 2004, Nigel McNie



  1. #include <stdio.h>


  2. #include <string.h>


  3. #include <stdarg.h>


  4. #include <stdlib.h>


  5.  


  6. int csharpStyleFormat(const char *format, …)


  7. {


  8.         int extractIdx = -1;


  9.         int argArray[256];


  10.         char buf[1024] = {0,};


  11.         int offset = 0;


  12.  


  13.         va_list ap;


  14.         va_start(ap, format);


  15.  


  16.         const char *cpst = format;


  17.         const char *st = format -1;


  18.         const char *end = NULL;


  19.  


  20.         while (st = strchr(st+1, ‘{‘), st) {


  21.                 char tmpBuf[256] = {0,};


  22.  


  23.                 end = strchr(st+1, ‘}’);


  24.                 memcpy(tmpBuf, st+1, end-(st+1));


  25.                 int index = atoi(tmpBuf);


  26.  


  27.                 while (index > extractIdx) {


  28.                         argArray[++extractIdx] = va_arg(ap, int);


  29.                 }


  30.  


  31.                 int length = (int)(st – cpst);


  32.                 memcpy(buf+offset, cpst, length);


  33.                 offset += length;


  34.                 offset += sprintf(buf+offset, “%d”, argArray[index]);


  35.  


  36.                 cpst = end + 1;


  37.         }


  38.  


  39.         int length = strlen(cpst);


  40.         memcpy(buf+offset, cpst, length);


  41.  


  42.         va_end(ap);


  43.  


  44.         printf(buf);


  45.         return 0;


  46. }


  47.  


  48.  


  49. int main()


  50. {


  51.         csharpStyleFormat(“{2} = {0} + {1}\n, 10, 20, 10+20);


  52.         return 0;


  53. }

Parsed in 0.047 seconds

코드는 이렇다.

csharpStyleFormat(“{2} = {0} + {1}\n”, 10, 20, 10+20);
라고 코드에 쓰면
30 = 10 + 20
이라고 출력됨.

변수타입은 오로지 int만 되는데 {2:d} 이런식으로 변수형을 지정하게 하면 다른 변수들도 가능할듯.
하지만 귀찮..

코드는 에러처리, 최적화는 생각도 하지 않았음…

아 가슴이 답답해…

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다