printf가 동작하는 가장 큰 틀이다.
void ft_flag_reset(t_list *flag)
{
flag들을 초기화 시켜줌.
}
void ft_flag_parser(char **args, t_list *flag, va_list ap)
{
여기서 (**args)가 '.', '+', '0', ' ', '#', 1 ~ 9인지 확인하고 그에 맞는 flag값을 바꿔줌.
if, '.' 이 들어오면 '.' 뒤에 뭐가 오는지 확인하고 그에 맞게 flag값을 변경시켜줌.
if , (**args)가 1 ~ 9이면 ft_flag_atoi(args)함수로 들어가서 args의 주소값을 증가시키면서 만든 그 크기값을 width에 저장.
}
void ft_setting(char **args, t_list *flag, va_list ap, int *val)
{
ft_check_str(flag, ap, val); // 서식지정자가 's'인 경우
ft_check_char(args, flag, ap, val); // 서식지정자가 'c' or '%'인 경우
ft_check_hexu(args, flag, ap, val); // 서식지정자가 'u' or 'x' or 'X인 경우
ft_check_int(flag, ap, val); // 서식지정자가 'd' or 'i'인 경우
ft_check_ads(flag, ap, val); // 서식지정자가 'p'인 경우
여기서 (**args)가 어떤 서식지정자인지 확인해서 그에 맞게 세팅해서 출력하는 함수에 보냄.
}
void ft_print_check(char **args, t_list *flag, va_list ap, int *val)
{
...
ft_flag_parser(args, flag, ap);
=> (**args)가 '%'를 만났을 때 그 주소값을 들고와서 그 다음 값이 서식지정자인지 체크하고 아니면 그때의 args주소값과 flag를 넘겨주어 flag체크를 하는 함수.
ft_setting(args, flag, ap, val);
=> (**args)가 서식지정자를 만났을 때, ft_flag_parser함수에서 설정한 flag들을 서식지정자에 맞게 출력하도록 만드는 함수.
...
}
int ft_printf(const char *args, ...)
{
...
ft_print_check((char **)&args, flag, ap, &val);
=> args가 '%'를 만났을 때, 서식지정자를 만날 때 까지 체크를 해서 최종적으로 출력하는 함수.
ft_putchar(*args, &val);
=> args가 '%'를 안 만났을 때, 바로 출력하는 함수.
...
return (val);
}