int ft_printf(const char *format, ...) 는 format을 인자로 받아 while문을 통해 한글자씩 돌리면서 '%'가 나오면 파싱한다.
이때 % 다음에 오는 것이 '\0' 문자라면 파싱하지 않고 넘어간다.
int ft_parser(char format, va_list ap)는 % 뒤에 나온 문자을 char c를 통해 받아서 파싱한다.
int ft_parser(char format, va_list ap)
{
if (format == 'd' || format == 'i')
return (ft_printf_di(va_arg(ap, int)));
else if (format == 'u')
return (ft_printf_u(va_arg(ap, int)));
else if (format == 'c')
return (ft_putchar(va_arg(ap, int)));
else if (format == 's')
return (ft_putstr(va_arg(ap, char *)));
else if (format == 'p')
return (ft_printf_p(va_arg(ap, unsigned long)));
else if (format == 'x' || format == 'X')
return (ft_put_hex(va_arg(ap, unsigned int), c));
else
return (ft_putchar('%'));
}
int ft_putchar(char c)의 경우 생략하겠다.
int ft_putstr(char *str)의 경우는 이전에 사용했던 그대로의 원형에서 들어온 입력값이 없을 시에 (null)을 출력하도록 했다.
int ft_printf_di(long long n)는 10진수 signed int를 처리하는 함수이다. 부호가 존재한다는 뜻이다. 음수의 경우에 조건문을 통해서 따로 처리해주었다.
나머지는 signed int의 MAX 값인 2147483647을 기준점 잡아 처리해주었다.
n이 -2147483648인 경우 조건문에 들어가서 음수 처리가 되는데, 이때 2147483648이 된다. 이때 출력이 제대로 되어야하므로 이 또한 조건문으로 처리를 해준다. (매개변수를 long long으로 받는 이유이다.)
int ft_printf_u(unsigned int n)는 10진수 unsigned int를 처리하는 함수이다. 이는 ft_printf_di를 했던 방식과 상당히 유사하다. 오히려 음수를 처리할 필요가 없으니 더 간단하다.
int ft_printf_p(uintptr_t n)는 포인터가 참조하고 있는 메모리의 주소 값 (8자리의 16진수)을 출력해준다.
때문에 unsigned long으로 처리해주게 되는데 이는 unsigned long의 크기가 8byte이기 때문이다.
이것을 설명하려면 바이트 어드레싱 & 바이트 패딩에 대해 알아야한다.
int ft_put_hex(unsigned int n, char format)는 format x & X를 처리해주는 함수이다. 16진수의 형태로 출력을 한다.
hex = "0123456789ABCDEF";
if (format == 'x')
hex = "0123456789abcdef";
이렇게 조건문을 통해 베이스처리를 해주었다. (덮어쓰기인셈.)
위의 10진수를 출력하는 함수들과 유사하게 처리하였다. (재귀)